คำตอบสั้น ๆ: อ่านค่า Load Average ให้ถูกความหมาย แล้วไล่หาว่าคอขวดอยู่ที่ CPU, ดิสก์ หรือหน่วยความจำ ด้วย top, vmstat, iostat และ pidstat
คู่มือนี้อธิบาย Load Average ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
เมื่อเว็บช้าหรือเซิร์ฟเวอร์ตอบสนองหน่วง สิ่งแรกที่ทุกคนดูคือ Load Average แต่ตัวเลขนี้ถูกเข้าใจผิดบ่อยที่สุดในบรรดาค่าทั้งหมดบน Linux เพราะมันไม่ได้วัดแค่ CPU อย่างที่หลายคนคิด
คู่มือนี้อธิบายความหมายที่ถูกต้องของ Load Average แล้วไล่หาสาเหตุทีละชั้นตามลำดับที่ควรตรวจจริง จาก CPU ไปดิสก์ ไปหน่วยความจำ และไปที่เครือข่าย พร้อมคำสั่งที่ใช้ได้ทั้งบน Ubuntu, Debian, AlmaLinux และ Rocky Linux
สิ่งที่ต้องเตรียม (Load Average)
- สิทธิ์ SSH เข้าเซิร์ฟเวอร์ และสิทธิ์
sudo - ติดตั้งชุดเครื่องมือวัดผล หากยังไม่มี
# Ubuntu / Debian
sudo apt install -y sysstat procps
# AlmaLinux / Rocky Linux
sudo dnf install -y sysstat procps-ng
ขั้นตอนที่ 1: อ่าน Load Average ให้ถูกความหมาย
uptime
cat /proc/loadavg
nproc
ตัวเลขสามตัวคือค่าเฉลี่ยของ 1, 5 และ 15 นาทีที่ผ่านมา และมันนับ "จำนวนโปรเซสที่กำลังทำงานหรือกำลังรอ" ไม่ใช่เปอร์เซ็นต์ CPU สิ่งที่หลายคนพลาดคือโปรเซสที่รออ่านเขียนดิสก์อยู่ก็ถูกนับรวมด้วย
เทียบกับจำนวนคอร์เสมอ ค่าที่ได้จาก nproc คือเพดานคร่าว ๆ
- เครื่อง 4 คอร์ Load 4.0 หมายถึงใช้เต็มพอดี ยังไม่ถือว่าผิดปกติ
- เครื่อง 4 คอร์ Load 12.0 หมายถึงมีงานรอคิวมากกว่าที่ทำไหวสามเท่า
- เครื่อง 4 คอร์ Load 1.0 แต่เว็บช้า แปลว่าคอขวดไม่ได้อยู่ที่ปริมาณงาน ให้ไปดูข้อ 4 และ 5
ดูแนวโน้มด้วย ถ้าค่า 1 นาทีสูงกว่า 15 นาทีมาก แปลว่าปัญหาเพิ่งเกิดและกำลังแย่ลง ถ้ากลับกันแปลว่าผ่านจุดพีคมาแล้ว
ขั้นตอนที่ 2: แยกให้ออกว่าเป็น CPU หรือการรอดิสก์
นี่คือทางแยกสำคัญที่สุด ใช้ vmstat เก็บตัวอย่างทุกวินาที
vmstat 1 10
ดูสามคอลัมน์นี้
- r จำนวนโปรเซสที่พร้อมทำงานและรอ CPU ถ้าค่านี้สูงกว่าจำนวนคอร์ต่อเนื่อง แปลว่าคอขวดคือ CPU
- b จำนวนโปรเซสที่ติดรอ I/O ถ้าค่านี้สูง แปลว่าคอขวดคือดิสก์
- wa เปอร์เซ็นต์เวลาที่ CPU ว่างเพราะรอ I/O ค่าเกิน 20 ต่อเนื่องคือสัญญาณว่าดิสก์ตามไม่ทัน
ในคอลัมน์ฝั่ง cpu ให้ดู us (งานของผู้ใช้) และ sy (งานของเคอร์เนล) ประกอบ ถ้า sy สูงผิดปกติมักเกี่ยวกับเครือข่าย ระบบไฟล์ หรือ Container จำนวนมาก
ขั้นตอนที่ 3: หาโปรเซสที่กิน CPU
top -o %CPU
ใน top กด 1 เพื่อแยกดูรายคอร์ กด M เพื่อเรียงตามการใช้หน่วยความจำ และกด c เพื่อดูคำสั่งเต็มพร้อมพารามิเตอร์ ซึ่งมักเป็นตัวบอกว่าใครเรียกงานนั้น
ถ้าอยากได้ภาพเฉลี่ยแทนภาพวินาทีเดียว ใช้ pidstat
pidstat -u 2 5
สำหรับเว็บเซิร์ฟเวอร์ ให้ดูว่าเป็น php-fpm, mysqld หรือ nginx โดยปกติ php-fpm หลายตัวกิน CPU เต็มพร้อมกันมักแปลว่ามีสคริปต์ที่ช้าหรือมีทราฟฟิกจากบอต
ขั้นตอนที่ 4: ตรวจดิสก์
iostat -xz 2 5
ดูคอลัมน์ %util ซึ่งบอกว่าดิสก์ยุ่งกี่เปอร์เซ็นต์ของเวลา และ await ซึ่งคือเวลาเฉลี่ยที่คำขอหนึ่งต้องรอ หน่วยเป็นมิลลิวินาที บน SSD ค่า await ควรอยู่หลักหน่วย ถ้าขึ้นไปหลักสิบหรือร้อยแปลว่าดิสก์เป็นคอขวดชัดเจน
หาว่าโปรเซสไหนอ่านเขียนหนัก
sudo pidstat -d 2 5
sudo iotop -oPa
สาเหตุที่พบบ่อยคือ งานสำรองข้อมูลที่ทับกับเวลาทำการ การ import ฐานข้อมูลขนาดใหญ่ ไฟล์ Log ที่เขียนถี่เกินไป และ MySQL ที่ไม่มี Index จนต้องอ่านทั้งตาราง