Optimization

VPS chạy chậm phải kiểm tra những gì

SSH vào VPS thấy mọi thứ ì ạch, lệnh nào cũng đợi vài giây mới trả kết quả, đó là lúc bạn cần dừng việc "đoán" và bắt đầu "đo". VPS chạy chậm hiếm khi là do một lý do riêng biệt, mà thường là sự kết hợp giữa thiếu tài nguyên và cấu hình chưa hợp lý. Bài này mình sẽ chỉ bạn đúng quy trình kiểm tra một VPS Linux (áp dụng cho Ubuntu 24.04 LTS, Debian 12, AlmaLinux 9) theo thứ tự ưu tiên: CPU, RAM, swap, I/O và mạng, kèm lệnh cụ thể và cách xử lý từng trường hợp.

  • Tóm tắt nhanh: Kiểm tra theo thứ tự: CPU (top/htop), RAM (free -h), swap (swapon --show), I/O (iostat) và mạng (iperf3).
  • RAM thiếu và swap hoạt động mạnh là nguyên nhân hàng đầu khiến VPS chạy chậm "như rùa" mà CPU vẫn thấp.
  • I/O nghẽn trên ổ cứng thường đi kèm chỉ số iowait cao ở lệnh top.
  • Xác định đúng nguyên nhân trước khi nâng cấp gói VPS, nếu không bạn trả tiền thêm mà VPS vẫn chậm.

Yêu cầu trước khi bắt đầu

  • VPS chạy hệ điều hành Linux: Ubuntu 24.04 LTS, Debian 12 hoặc AlmaLinux 9 (bài dùng lệnh apt, nếu dùng dnf thì thay tương ứng).
  • Quyền sudo hoặc root để cài công cụ chẩn đoán và thay đổi cấu hình.
  • Kết nối SSH ổn định tới VPS.

Vì sao phải kiểm tra có hệ thống thay vì đoán mò?

Khi VPS chậm, phản xạ của nhiều người là đi nâng cấp RAM hoặc CPU ngay. Điều này tốn tiền mà không giải quyết gốc rễ. Có những trường hợp VPS cấu hình cao nhưng vẫn chậm vì swap hoạt động liên tục do một tiến trình rò rỉ bộ nhớ, hoặc vì website bị bot quét liên tục làm nghẽn PHP-FPM. Kiểm tra có thứ tự giúp bạn tìm đúng "thủ phạm" trong vài phút thay vì vài ngày.

Một nguyên tắc quan trọng: không có công cụ nào trả lời mọi câu hỏi. top cho bạn góc nhìn CPU và RAM, nhưng không cho biết ổ cứng đang đọc ghi bao nhiêu. free cho biết RAM còn trống, nhưng không nói tiến trình nào đang ngốn. Vì vậy bạn cần một bộ công cụ và đọc chúng theo trình tự, như bác sĩ đọc kết quả xét nghiệm trước khi kê đơn.

Công cụKiểm tra gìLệnh cài đặt
htopCPU, RAM theo tiến trìnhsudo apt install htop
sysstatiostat, sar, mpstatsudo apt install sysstat
iotopI/O theo tiến trình (cần root)sudo apt install iotop
iperf3Băng thông mạng giữa hai máysudo apt install iperf3

Bước 1 - Kiểm tra CPU xem có tiến trình nào treo không

Mở htop lên và nhìn ngay 3 thứ: load average ở góc trên bên trái, %CPU của từng lõi, và danh sách tiến trình tốn CPU nhất ở dưới. Load average là con số quan trọng nhất vì nó phản ánh số tiến trình đang chờ được xử lý trong 1, 5 và 15 phút gần nhất.

htop

Nếu VPS của bạn có 2 vCPU và load average duy trì ở mức 4.0 hoặc cao hơn, nghĩa là CPU đang bị quá tải gấp đôi, các tiến trình phải xếp hàng chờ. Lúc này bạn cần xem tiến trình nào đang chiếm CPU cao nhất ở cột CPU%. Các "thủ phạm" thường gặp: PHP-FPM worker bị kẹt, MySQL/MariaDB chạy query nặng, hoặc một cron job Python chạy sai logic.

Nếu tìm thấy tiến trình bất thường, xem log của nó trước khi kill. Lệnh kill ngay có thể khiến database bị hỏng nếu bạn kill nhầm tiến trình MySQL.

# Xem log hệ thống tìm dấu vết sự cố
journalctl -xe --since "1 hour ago" | grep -i error | head -20

# Xem log PHP-FPM nếu website chậm
sudo tail -n 50 /var/log/php8.3-fpm.log

Verify: Chạy lại htop, nếu load average giảm dần xuống dưới số vCPU và không còn tiến trình nào treo ở trạng thái R (running) liên tục, thì CPU đã hết nghẽn.

Bước 2 - Kiểm tra RAM và swap, nguyên nhân hàng đầu khiến VPS chậm

VPS chậm mà CPU không cao, rất có thể là do thiếu RAM. Khi RAM cạn, Linux đẩy dữ liệu xuống swap trên ổ cứng. Ổ cứng chậm hơn RAM hàng trăm lần, nên mỗi lần swap là mỗi lần toàn hệ thống bị "thắng gấp".

free -h

Nhìn vào dòng Mem: cột available là lượng RAM thực sự có thể dùng, không phải cột free (Linux dùng RAM tạm cho cache). Nếu available dưới 200MB trên VPS 2GB, bạn đang ở mức báo động. Tiếp theo nhìn dòng Swap: nếu cột used lớn hơn 0 và tăng liên tục, swap đang hoạt động mạnh.

# Xem mức độ swap đang dùng
swapon --show

# Xem tiến trình nào đang dùng nhiều RAM nhất
ps aux --sort=-%mem | head -10

Nếu phát hiện một tiến trình ngốn RAM bất thường như PHP-FPM chiếm 1.5GB trên VPS 2GB, kiểm tra cấu hình pm.max_children của PHP-FPM xem có đặt quá cao so với RAM không. Chi tiết cách tối ưu bạn có thể tham khảo bài vì sao VPS bị đầy RAM và cách xử lý hiệu quảcách giảm RAM sử dụng trên VPS Linux hiệu quả.

# Xem nhanh cấu hình PHP-FPM (đường dẫn có thể khác theo bản)
grep -E "^pm|^pm\.max_children|^pm\.start_servers" /etc/php/8.3/fpm/pool.d/www.conf

Verify: Chạy free -h lại sau khi kill tiến trình hoặc restart service, nếu available tăng lên và swap used giảm dần về 0 thì RAM đã được giải phóng.

Bước 3 - Kiểm tra swap và điều chỉnh cho hợp lý

Nhiều VPS mới cài không có swap, khi RAM cạn thì hệ thống có thể bị treo cứng vì kernel OOM (Out Of Memory) phải kill tiến trình bất kỳ. Nên kiểm tra xem VPS của bạn có swap không, và nếu chưa có thì tạo một file swap khoảng 1-2GB là hợp lý cho VPS 2GB RAM.

# Kiểm tra swap hiện có
swapon --show

# Nếu trống, tạo file swap 2GB
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# Ghi vào fstab để swap tự bật sau reboot
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Một lưu ý quan trọng: swap chỉ là "phao cứu sinh", không phải giải pháp lâu dài. Nếu swap used thường xuyên trên 500MB, nghĩa là RAM thật sự thiếu, bạn nên tối ưu ứng dụng hoặc cân nhắc gói VPS có RAM lớn hơn. Hướng dẫn chi tiết về cách cấu hình swap phù hợp có trong bài cấu hình swap và tối ưu bộ nhớ cho VPS RAM thấp.

Verify: Lệnh swapon --show hiển thị file swap 2G đang active. Nếu cần kiểm tra sau khi reboot, chạy lại lệnh này để chắc chắn fstab hoạt động đúng.

Bước 4 - Kiểm tra I/O ổ cứng, thủ phạm thầm lặng

Một VPS chạy trên ổ cứng NVMe thường có tốc độ đọc ghi vài trăm MB/s, nhưng nếu có quá nhiều tiến trình cùng ghi dữ liệu, hoặc ổ cứng đang xuống cấp, I/O sẽ nghẽn. Dấu hiệu nhận biết: lệnh top hiển thị cột wa (iowait) cao, thường trên 20%.

# Cài sysstat nếu chưa có
sudo apt install sysstat

# Xem I/O của ổ cứng, nhấn q để thoát
iostat -x 2

Trong output của iostat -x, nhìn vào cột %util của ổ vda hoặc nvme0n1. Nếu con số này liên tục trên 80%, ổ đang hoạt động gần hết công suất. Cột await (thời gian chờ trung bình mỗi request) nếu cao hơn 50ms thì ổ đang phản hồi chậm bất thường.

Để biết tiến trình nào đang ghi đọc nhiều, dùng iotop (chạy với root):

sudo iotop -o

Các nguyên nhân I/O nghẽn thường gặp: MySQL/MariaDB ghi log quá nhiều, PHP-FPM ghi session liên tục, hoặc một cron job backup đang chạy vào giờ cao điểm. Nếu VPS của bạn chạy database, hãy đọc thêm bài tối ưu MariaDB trên VPS 2GB RAM hiệu quả để giảm áp lực ghi xuống ổ cứng.

Verify: Chạy lại iostat -x 1 3, nếu %util giảm xuống dưới 50% sau khi xử lý, I/O đã hết nghẽn. Có thể kiểm tra tốc độ ổ cứng thực tế bằng lệnh fio như hướng dẫn trong bài cách kiểm tra tốc độ đọc ghi ổ NVMe trên VPS.

Bước 5 - Kiểm tra mạng và băng thông

Sau khi loại trừ CPU, RAM và I/O, nếu VPS vẫn chậm thì kiểm tra mạng. Triệu chứng điển hình: SSH vào thì lag, website tải chậm nhưng topfree đều bình thường. Vấn đề có thể do băng thông quốc tế bị nghẽn vào giờ cao điểm, hoặc do VPS bị tấn công DDoS làm nghẽn đường truyền.

# Kiểm tra cước mạng hiện tại
sudo apt install iftop
sudo iftop -i eth0

Chạy iftop và quan sát tổng băng thông vào/ra ở góc trên. Nếu thấy một IP lạ liên tục gửi hàng trăm Mbps tới VPS, đó là dấu hiệu bị tấn công. Nếu không, kiểm tra tốc độ mạng thực tế giữa VPS và máy tính của bạn bằng iperf3 (cần 2 máy).

# Trên VPS, chạy ở chế độ server
iperf3 -s

# Trên máy tính của bạn, chạy ở chế độ client
iperf3 -c IP_VPS

Một lưu ý quan trọng: nếu VPS của bạn có mục đích phục vụ user tại Việt Nam và đặt tại hạ tầng trong nước (như VPS Linux tại Việt Nam có IPv4 riêng nội địa), thì kết quả iperf3 từ một máy chủ nước ngoài sẽ không phản ánh đúng trải nghiệm user nội địa. Ngược lại, nếu user của bạn ở nước ngoài truy cập website đặt trên VPS Việt Nam, chặng transit quốc tế sẽ là yếu tố quyết định tốc độ, và con số này phụ thuộc cả vào mạng của nhà cung cấp đầu bên kia.

Verify: Nếu iperf3 cho băng thông trên 50 Mbps giữa hai máy trong cùng nước, kết nối mạng ổn. Nếu chỉ đạt 1-5 Mbps với một máy chủ quốc tế, đó là đặc thù của đường truyền quốc tế chứ không phải lỗi VPS.

Xử lý lỗi thường gặp khi VPS chậm

Trường hợp 1: Load cao nhưng không thấy tiến trình nào ngốn CPU

Hiện tượng này thường do process đang ở trạng thái D (uninterruptible sleep), tức đang chờ I/O từ ổ cứng. Nguyên nhân thường là ổ cứng bị lỗi hoặc bị nghẽn do quá nhiều request. Chạy iostat -x 1 để kiểm tra %util của ổ cứng. Nếu ổ cứng NVMe chạy %util rất cao liên tục, hãy kiểm tra xem có tiến trình backup nào đang chạy hoặc database đang ghi log quá nhiều không.

Trường hợp 2: Website tải chậm nhưng tài nguyên VPS đều thấp

Khi CPU, RAM, I/O đều thấp mà website vẫn chậm, vấn đề nằm ở tầng ứng dụng: PHP-FPM cấu hình sai, database query chậm, hoặc CDN không hoạt động. Kiểm tra log PHP-FPM và slow query log của MySQL/MariaDB. Trường hợp này cần phân tích riêng, tham khảo thêm bài tối ưu MariaDB buffer pool và slow query log.

Trường hợp 3: VPS chậm sau khi khởi động lại

Sau reboot, nếu VPS chậm trong vài phút đầu, đó là do các service (MySQL, PHP-FPM, Nginx) đang khởi động cùng lúc làm quá tải tạm thời. Nếu chậm kéo dài, kiểm tra xem có cron job nào chạy lúc boot không, và kiểm tra log khởi động bằng lệnh systemd-analyze blame để xem service nào khởi động chậm nhất.

Câu hỏi thường gặp

VPS chậm có phải lúc nào cũng do thiếu tài nguyên?

Không. Có nhiều trường hợp VPS cấu hình cao nhưng vẫn chậm do ứng dụng viết kém hiệu quả: query database không có index, PHP-FPM cấu hình sai, hoặc cache không hoạt động. Luôn kiểm tra theo quy trình CPU -> RAM -> I/O -> mạng trước khi quyết định nâng cấp gói.

Nên xem chỉ số nào để biết VPS sắp hết RAM?

Xem cột available trong lệnh free -h, không phải cột free. Nếu available dưới 10-15% tổng RAM và swap bắt đầu được sử dụng, bạn cần hành động ngay: tối ưu ứng dụng hoặc nâng cấp bộ nhớ.

Swap cao có hại không và khi nào nên thêm swap?

Swap hoạt động thường xuyên sẽ làm VPS chậm vì ổ cứng chậm hơn RAM rất nhiều. Nên có swap khoảng 1-2GB cho VPS 2GB RAM làm "phao cứu sinh" để tránh bị treo do OOM, nhưng nếu swap used thường xuyên trên 500MB thì cần xem lại việc tối ưu RAM của ứng dụng, chứ không phải tăng swap.

VPS dùng ổ NVMe có bị nghẽn I/O không?

Có. NVMe nhanh hơn SATA SSD nhưng vẫn có giới hạn. Nếu có quá nhiều tiến trình ghi dữ liệu đồng thời (database lớn, log nhiều, backup), I/O vẫn có thể nghẽn. Kiểm tra bằng iostat -x, nếu %util trên 80% duy trì liên tục thì ổ đang bị quá tải.

Nên nâng cấp gói VPS hay tối ưu ứng dụng trước?

Tối ưu ứng dụng trước. Việc tối ưu PHP-FPM, MariaDB, và bật cache đúng cách có thể giảm 50-70% tài nguyên sử dụng mà không tốn chi phí. Chỉ nâng cấp gói VPS giá rẻ theo tháng khi đã loại trừ hết các nguyên nhân từ cấu hình nhưng tài nguyên vẫn thực sự thiếu.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.