Memory Management — free และ vmstat

เมื่อ Application ทำงานช้าหรือ Server เริ่มใช้ Swap มากผิดปกติ การตรวจสอบสถานะหน่วยความจำเป็นขั้นตอนแรกที่ขาดไม่ได้ Linux มีเครื่องมือหลักสองตัวสำหรับงานนี้คือ free ที่แสดงภาพรวมการใช้งาน RAM และ Swap แบบรวดเร็ว และ vmstat ที่แสดงสถิติ Virtual Memory, CPU และ I/O แบบ Real-time พร้อมแนวโน้มการเปลี่ยนแปลงในช่วงเวลาที่กำหนด

บทความนี้อธิบายการใช้งาน free และ vmstat สำหรับ Memory Monitoring ตั้งแต่การอ่านค่า RAM ที่ใช้งานจริง ความแตกต่างระหว่าง used/cache/available การตีความค่า vmstat สำหรับ Troubleshoot ปัญหา Memory และ Swap รวมถึงเครื่องมือเสริมอย่าง /proc/meminfo และ smem

free — ดูภาพรวม RAM และ Swap

free เป็นคำสั่งพื้นฐานที่แสดงสถานะการใช้งานหน่วยความจำทั้งหมดในรูปแบบตาราง ติดมากับทุก Linux Distribution

# แสดงหน่วยความจำในหน่วยต่าง ๆ
free -h     # Human-readable (MB/GB อัตโนมัติ)
free -m     # แสดงเป็น Megabytes
free -g     # แสดงเป็น Gigabytes
free -b     # แสดงเป็น Bytes

# อัพเดตทุก 2 วินาที (Continuous)
free -h -s 2

# อัพเดต 5 ครั้ง แล้วหยุด
free -h -s 2 -c 5

อ่านค่าผลลัพธ์ของ free

# ตัวอย่าง Output
              total        used        free      shared  buff/cache   available
Mem:           7.7G        2.1G        1.2G        256M        4.4G        5.1G
Swap:          2.0G        128M        1.9G

# คำอธิบายแต่ละคอลัมน์
# total     — หน่วยความจำทั้งหมด
# used      — หน่วยความจำที่ใช้งานอยู่ (ไม่รวม buff/cache)
# free      — หน่วยความจำที่ว่างเปล่าจริง ๆ
# shared    — หน่วยความจำที่แชร์ระหว่าง Process (tmpfs)
# buff/cache — หน่วยความจำที่ใช้เป็น Buffer และ Cache ของ Kernel
# available  — หน่วยความจำที่ใช้ได้จริง = free + คืนได้จาก buff/cache

ค่าที่ควรดู: available ไม่ใช่ free

# ความเข้าใจผิดที่พบบ่อย:
# "free" ต่ำ ≠ หน่วยความจำเต็ม

# Linux ใช้ RAM ที่ว่างเป็น Cache เพื่อเพิ่มประสิทธิภาพ
# เมื่อ Process ต้องการ RAM เพิ่ม Kernel จะคืน Cache ให้ก่อน

# ตัวอย่าง: total=8GB, used=2GB, free=0.5GB, buff/cache=5.5GB
# available = ~5.8GB → ยังมีหน่วยความจำเหลือมาก

# กฎง่าย ๆ:
# available > 20% ของ total → ปกติ
# available < 10% ของ total → ควรตรวจสอบ
# Swap used > 0 แต่น้อย → อาจปกติ
# Swap used สูงมาก → RAM ไม่พอ ต้องเพิ่มหรือ Optimize

vmstat — Virtual Memory Statistics

vmstat แสดงสถิติเกี่ยวกับ Virtual Memory, Process, CPU, I/O และ Interrupts ในรูปแบบตารางที่อัพเดตได้ต่อเนื่อง เหมาะสำหรับ Troubleshoot ปัญหาประสิทธิภาพเพราะเห็นแนวโน้มการเปลี่ยนแปลงได้ชัดเจน

# แสดงสถิติครั้งเดียว
vmstat

# อัพเดตทุก 2 วินาที (กด Ctrl+C เพื่อหยุด)
vmstat 2

# อัพเดตทุก 2 วินาที จำนวน 10 ครั้ง
vmstat 2 10

# แสดงหน่วยเป็น MB
vmstat -S M 2

# แสดงข้อมูล Disk I/O แยกตาม Partition
vmstat -d

# แสดง Active/Inactive Memory
vmstat -a 2

อ่านค่าคอลัมน์ของ vmstat

# ตัวอย่าง Output
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0  131072 1048576 204800 4194304  0    1    10    30  500 1200  5  2 92  1  0

# procs
# r = จำนวน Process ที่รอ CPU (runnable) — ถ้า > จำนวน CPU Core = CPU bottleneck
# b = จำนวน Process ที่รอ I/O (blocked/uninterruptible sleep)

# memory (KB)
# swpd  = ปริมาณ Swap ที่ใช้งาน
# free  = RAM ที่ว่างเปล่า
# buff  = Buffer Memory (Metadata ของ Filesystem)
# cache = Page Cache (Data ของไฟล์)

# swap
# si = Swap-in (KB/s) — ดึงข้อมูลจาก Swap เข้า RAM
# so = Swap-out (KB/s) — ย้ายข้อมูลจาก RAM ออก Swap

# io
# bi = Blocks In — อ่านจาก Disk (blocks/s)
# bo = Blocks Out — เขียนไปยัง Disk (blocks/s)

# system
# in = Interrupts ต่อวินาที
# cs = Context Switches ต่อวินาที

# cpu (เปอร์เซ็นต์)
# us = User CPU
# sy = System/Kernel CPU
# id = Idle
# wa = Wait I/O
# st = Stolen (สำหรับ VM)

ตีความค่า vmstat สำหรับ Troubleshoot

# สัญญาณ Memory Pressure:
# so > 0 (Swap-out ต่อเนื่อง) → RAM ไม่พอ Process ถูกย้ายไป Swap
# si > 0 (Swap-in ต่อเนื่อง)  → กำลังดึงข้อมูลจาก Swap = ช้ามาก

# สัญญาณ CPU Bottleneck:
# r > (จำนวน CPU Core) ต่อเนื่อง → CPU ไม่พอ Process รอ

# สัญญาณ Disk I/O Bottleneck:
# wa สูง (> 20%) ต่อเนื่อง → Disk ช้า หรือ I/O รอนาน
# b > 0 ต่อเนื่อง → มี Process ติดรอ I/O

# สัญญาณปกติ:
# si = 0, so = 0 → ไม่มีการใช้ Swap = ดี
# id สูง (> 70%) → CPU ว่าง
# wa ต่ำ (< 5%) → Disk I/O ปกติ

/proc/meminfo — ข้อมูล Memory ละเอียด

ไฟล์ /proc/meminfo คือแหล่งข้อมูลหน่วยความจำที่ละเอียดที่สุดใน Linux ทั้ง free และ vmstat ดึงข้อมูลจากไฟล์นี้

# ดูข้อมูล Memory ทั้งหมด
cat /proc/meminfo

# ดูเฉพาะค่าสำคัญ
grep -E "^(MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree|SwapCached|Dirty|Writeback)" /proc/meminfo

# ตัวอย่าง Output ที่สำคัญ
# MemTotal:    8070604 kB  — RAM ทั้งหมด
# MemFree:     1048576 kB  — RAM ที่ว่าง
# MemAvailable: 5242880 kB  — RAM ที่ใช้ได้จริง
# Buffers:      204800 kB  — Buffer Memory
# Cached:      4194304 kB  — Page Cache
# SwapTotal:   2097152 kB  — Swap ทั้งหมด
# SwapFree:    1966080 kB  — Swap ที่ว่าง
# Dirty:         10240 kB  — ข้อมูลรอเขียนลง Disk
# Writeback:        0 kB  — ข้อมูลกำลังเขียนลง Disk

ดู Memory Usage ของแต่ละ Process

# ดู Process ที่ใช้ RAM มากที่สุดด้วย ps
ps aux --sort=-%mem | head -10

# ดู RSS (Resident Set Size) และ VSZ (Virtual Memory Size)
# RSS = RAM จริงที่ Process ใช้ตอนนี้
# VSZ = Virtual Memory ทั้งหมดที่ Process ขอ (รวม Memory-mapped files)

# ดู Memory ของ Process เฉพาะ PID
cat /proc/1234/status | grep -E "^(VmRSS|VmSize|VmSwap)"

# ดู Memory Map ของ Process
cat /proc/1234/maps | head -20
pmap 1234          # สรุปแบบอ่านง่าย
pmap -x 1234       # รายละเอียดทุก Segment

smem — Memory Usage แบบ Shared-aware

smem เป็นเครื่องมือที่คำนวณ Memory Usage แบบคำนึงถึง Shared Memory ทำให้ได้ตัวเลขที่แม่นยำกว่า RSS เพราะหักส่วนที่แชร์กับ Process อื่นออก

# ติดตั้ง smem
sudo apt install smem      # Ubuntu/Debian
sudo dnf install smem      # RHEL/Rocky

# ดู Memory Usage ทุก Process (เรียงตาม USS)
smem -r

# ดูสรุปรวมต่อ User
smem -u

# ดูสรุปรวมต่อ Process (ชื่อ)
smem -w -k

# คำอธิบายคอลัมน์ smem:
# USS (Unique Set Size)  = Memory ที่ Process ใช้คนเดียวจริง ๆ
# PSS (Proportional SS)  = USS + ส่วนแบ่งของ Shared Memory
# RSS (Resident Set Size) = Memory จริงทั้งหมด รวม Shared

จัดการ Swap

# ดู Swap ที่ใช้งานอยู่
swapon --show

# ดูรายละเอียด Swap พร้อมขนาด
cat /proc/swaps

# สร้าง Swap File ใหม่ขนาด 2GB
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# ตรวจสอบ Swap ที่เพิ่งสร้าง
free -h
swapon --show

# เพิ่ม Swap ถาวรใน /etc/fstab
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# ปรับ Swappiness (0-100, ค่าเริ่มต้น = 60)
# ค่าต่ำ = ใช้ Swap น้อย, ค่าสูง = ใช้ Swap มาก
cat /proc/sys/vm/swappiness
sudo sysctl vm.swappiness=10     # ปรับชั่วคราว

# ปรับถาวรใน /etc/sysctl.conf
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

ล้าง Cache เมื่อจำเป็น

โดยปกติ Linux จัดการ Cache อัตโนมัติและไม่จำเป็นต้องล้างเอง แต่ในกรณีที่ต้องการทดสอบหรือ Benchmark อาจต้องล้าง Cache ก่อน

# ซิงก์ข้อมูลที่ค้างใน Buffer ลง Disk ก่อน
sync

# ล้าง Page Cache เท่านั้น
echo 1 | sudo tee /proc/sys/vm/drop_caches

# ล้าง Dentries และ Inodes
echo 2 | sudo tee /proc/sys/vm/drop_caches

# ล้างทั้งหมด (Page Cache + Dentries + Inodes)
echo 3 | sudo tee /proc/sys/vm/drop_caches

# ⚠️ คำเตือน: ไม่ควรล้าง Cache บน Production Server ขณะมี Load
# เพราะ Cache ช่วยเพิ่มประสิทธิภาพอย่างมาก
# หลังล้าง Server จะช้าชั่วคราวจนกว่า Cache จะถูกสร้างขึ้นใหม่

Script ตรวจสอบ Memory อัตโนมัติ

#!/bin/bash
# /usr/local/bin/check-memory.sh
# แจ้งเตือนเมื่อ available memory ต่ำกว่า 15%

THRESHOLD=15   # เปอร์เซ็นต์ขั้นต่ำของ available

total=$(grep MemTotal /proc/meminfo | awk '{print $2}')
available=$(grep MemAvailable /proc/meminfo | awk '{print $2}')
percent=$(( available * 100 / total ))

if [ "$percent" -lt "$THRESHOLD" ]; then
    echo "[$(date)] WARNING: Available memory = ${percent}% (${available}kB / ${total}kB)" \
        | mail -s "[Alert] Low Memory on $(hostname)" [email protected]
fi

# เพิ่มใน Crontab รันทุก 5 นาที
# */5 * * * * /usr/local/bin/check-memory.sh

สรุป

free -h เป็นจุดเริ่มต้นที่เร็วที่สุดสำหรับตรวจสอบสถานะ RAM โดยค่าที่ควรดูคือ available ไม่ใช่ free เพราะ Linux ใช้ RAM ที่ว่างเป็น Cache อัตโนมัติ vmstat 2 เหมาะสำหรับ Monitor แนวโน้มการใช้งานต่อเนื่อง โดยเฉพาะค่า si/so ที่บอกว่ามีการใช้ Swap หรือไม่ และ /proc/meminfo ให้ข้อมูลละเอียดสุด การเข้าใจความแตกต่างระหว่าง used, buff/cache และ available เป็นทักษะพื้นฐานที่จำเป็นสำหรับ Troubleshoot ปัญหาประสิทธิภาพบน Production Server

แนะนำบริการ DE

การ Monitor และ Optimize Memory บน Server จริงต้องการสิทธิ์เข้าถึงระบบอย่างเต็มที่ Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบพร้อม RAM ที่ปรับขนาดได้ตามความต้องการ เหมาะสำหรับการทดสอบ Memory Management, ตั้งค่า Swappiness และ Monitor ปัญหา Memory Pressure บน Production Server จริง

หากต้องการโฮสต์เว็บไซต์โดยไม่ต้องจัดการ Memory Configuration เอง Cloud Hosting ของ DE มีระบบจัดสรรทรัพยากรอัตโนมัติและแสดงสถิติการใช้งาน RAM ผ่าน Control Panel