Skip to content
VDS · Khắc phục sự cố

CPU đạt 100%

Cách tìm tiến trình đang ăn hết nhân CPU, phân biệt tải thật với chờ đĩa và quyết định nên sửa mã hay chuyển lên tier cao hơn.

Cập nhật 23 tháng 8, 2026

Một đoạn cao nguyên trên biểu đồ CPU trong tab “Tổng quan” tự nó không phải là tình huống khẩn cấp: việc build một dự án hay tạo một tệp lưu trữ sẽ thực sự dùng hết tất cả các nhân rồi giải phóng chúng. Điều đáng lo là khi đoạn cao nguyên kéo dài hàng giờ và máy ngừng phản hồi. Hãy cùng tìm ra thủ phạm.

Bước 1. Xem thứ gì đang tiêu tốn tài nguyên

Tab “Màn hình” (VNC) thuận tiện để làm việc với các chương trình toàn màn hình:

btop
htop

Console nối tiếp không truyền kích thước cửa sổ; ở đó luôn là 80×24, nên giao diện sẽ bị cắt. Với console văn bản, hãy dùng các lệnh chuẩn:

top -b -n1 | head -20
ps aux --sort=-%cpu | head -10

Hãy nhớ phép tính: %CPU được tính theo từng nhân. 400% trên VDS-3 nghĩa là cả bốn nhân, còn 100% trên VDS-4 chỉ là một trong sáu nhân.

Bước 2. Phân biệt CPU với ổ đĩa

Tải trung bình (load average) cũng tăng do chờ I/O, không chỉ do tính toán:

uptime
vmstat 1 5

Trong kết quả của vmstat, hãy xem các cột us (mã người dùng), sy (kernel), wa (chờ ổ đĩa) và st (thời gian bị lấy đi). wa lớn nghĩa là CPU đang rảnh chờ ổ đĩa — nút thắt là tốc độ ghi, không phải tính toán. Đoạn cao nguyên của ổ đĩa trên các gói của chúng tôi được đặt theo quy tắc: ghi 60 MB/s mỗi nhân, không thấp hơn 60 và không cao hơn 400 MB/s, đọc cao gấp đôi, và một đợt bùng nổ cao gấp ba lần mức cao nguyên kéo dài 30 giây. Nếu một tác vụ ghi liên tục, đợt bùng nổ sẽ kết thúc và bạn sẽ chạm mức cao nguyên.

Bước 3. Điều tra một tiến trình cụ thể

pidstat -p <pid> 1 5
cat /proc/<pid>/status
journalctl -u <service> -n 100 --no-pager

Những phát hiện thường gặp:

  • một ứng dụng web quay vòng trong vòng lặp vô hạn sau một yêu cầu thất bại;
  • cơ sở dữ liệu đang chạy một truy vấn không có chỉ mục — hãy kiểm tra nhật ký truy vấn chậm của chính nó;
  • một tác vụ cron khởi chạy thường xuyên hơn mức nó có thể hoàn thành, và các phiên bản tích tụ lại: ps aux | grep <name> sẽ hiển thị hàng chục bản sao;
  • một miner lọt vào máy qua mật khẩu root yếu. Dấu hiệu là một tiến trình có tên vô nghĩa chạy dưới một người dùng không chuẩn và băng thông ra cao. Trong trường hợp này, cài lại máy từ tab “Truy cập” sẽ dễ hơn là dọn dẹp nó.

Bước 4. Giới hạn, đừng giết

Nếu tiến trình là cần thiết nhưng không nên cản trở phần còn lại:

renice -n 15 -p <pid>
systemctl set-property myapp.service CPUQuota=200%

CPUQuota=200% là hai nhân đầy đủ. Giới hạn của systemd vẫn tồn tại sau khi khởi động lại dịch vụ; renice thì không.

Trước khi giết một tiến trình bằng kill -9, hãy thử systemctl stop thông thường. Giết cưỡng bức một cơ sở dữ liệu khiến bạn mất các tệp bị hỏng và một lần khôi phục lâu dài ở lần khởi động tiếp theo.

Khi vấn đề không nằm ở mã

Nếu tải là chính đáng và liên tục, CPU Ryzen 9 7950X đang làm đúng việc của nó — đơn giản là không đủ nhân cho tác vụ. Gói chỉ có thể được thay đổi theo hướng tăng lên, với khoản thanh toán bổ sung cho những ngày còn lại của kỳ đã trả: xem bài viết Nâng cấp gói của bạn và thanh toán phần chênh lệch. Không thể hạ cấp trở lại, vì vậy trước tiên hãy chắc chắn từ biểu đồ tuần và tháng rằng đoạn cao nguyên không phải là sự cố một lần.