Vấn đề: RAM còn trống nhưng lệnh vẫn thất bạiBạn đang làm việc trong terminal thì đột nhiên các lệnh cơ bản như ls, top, hay htop ngừng hoạt động. Thay vì kết quả mong đợi, hệ thống trả về một lỗi khó chịu:
bash: fork: Cannot allocate memory
Bạn kiểm tra RAM và thấy server vẫn còn hàng gigabyte trống. Lỗi này nổi tiếng vì rất dễ gây nhầm lẫn. Nó hiếm khi có nghĩa là bạn đã hết RAM vật lý. Thay vào đó, nguyên nhân thường là Linux kernel đã đạt đến giới hạn tối đa về số lượng Process ID (PID), hoặc một người dùng cụ thể đã chạm trần số tiến trình được phép.
Tại sao lỗi này xảy raMỗi tác vụ, luồng hay tiến trình trong Linux đều cần một PID duy nhất. Kernel duy trì một ngưỡng cứng về tổng số PID có thể quản lý cùng lúc. Nếu hệ thống chạm ngưỡng này, nó không thể "fork" (tạo) thêm tiến trình mới. Các nguyên nhân phổ biến bao gồm:
- Cạn kiệt PID: Giới hạn
pid_maxtoàn hệ thống (thường mặc định là 32.768) đã bị chạm.- Hạn chế theo người dùng: Người dùng cụ thể đã đạt giới hạnulimitvề số tiến trình tối đa.- Rò rỉ luồng: Một ứng dụng bị lỗi hoặc một "fork bomb" đang tạo ra hàng nghìn luồng không kiểm soát được.- Giới hạn container: Một Docker container hoặc một systemd slice bị giới hạn bởi task limit cụ thể.## Xử lý khẩn cấpNếu bạn không thể chạy lệnh mới, cần giải phóng PID ngay lập tức. Nếu terminal vẫn còn phản hồi, hãy kiểm tra số lượng tiến trình hiện tại trên toàn hệ thống:
ps -eLf | wc -l
Nếu lệnh đó cũng thất bại với cùng lỗi fork, hãy thử đóng các phiên SSH không cần thiết hoặc dừng các dịch vụ nặng qua cloud console hoặc management panel. Để có thêm không gian ngay lập tức, bạn có thể tạm thời tăng gấp đôi giới hạn PID nếu có quyền root:
sudo sysctl -w kernel.pid_max=65536
Hoặc tăng giới hạn tiến trình cho phiên shell hiện tại:
ulimit -u 4096
Giải pháp lâu dài### 1. Tăng giới hạn PID toàn cụcCác môi trường có độ đồng thời cao, chẳng hạn như chạy nhiều ứng dụng Java hoặc microservice, thường cần nhiều hơn 32k PID mặc định. Trước tiên, kiểm tra giới hạn hiện tại:
cat /proc/sys/kernel/pid_max
Để thay đổi vĩnh viễn, chỉnh sửa file /etc/sysctl.conf:
sudo nano /etc/sysctl.conf
Thêm dòng này vào cuối file (đặt thành 64k hoặc 128k tùy nhu cầu):
kernel.pid_max = 65536
Áp dụng thay đổi ngay mà không cần khởi động lại:
sudo sysctl -p
2. Điều chỉnh giới hạn theo từng người dùng (ulimit)Đôi khi giới hạn hệ thống vẫn ổn, nhưng một service user cụ thể (như www-data hay mysql) lại chạm trần. Hãy chỉnh sửa cấu hình security limits:
sudo nano /etc/security/limits.conf
Thêm các dòng này để tăng số lượng tiến trình (nproc) cho tất cả người dùng, hoặc thay * bằng tên người dùng cụ thể:
* soft nproc 65535
* hard nproc 65535
3. Sửa giới hạn throttling của SystemdCác bản phân phối Linux hiện đại dùng systemd, vốn thường áp đặt giới hạn riêng lên các dịch vụ bất kể cài đặt toàn cục. Nếu một dịch vụ cụ thể như Nginx bị lỗi, hãy chỉnh sửa file override của nó:
sudo systemctl edit my_service_name.service
Chèn các dòng sau vào trình soạn thảo:
[Service]
TasksMax=infinity
Tải lại daemon và khởi động lại dịch vụ để áp dụng:
sudo systemctl daemon-reload
sudo systemctl restart my_service_name.service
4. Xác định rò rỉ tiến trìnhNếu số lượng PID vẫn tiếp tục tăng sau khi khởi động lại, có thể bạn đang gặp phải rò rỉ tiến trình. Dùng lệnh này để xem người dùng nào đang tiêu thụ nhiều PID nhất:
ps -efL | awk '{print $1}' | sort | uniq -c | sort -nr
Nếu thấy một người dùng đang sở hữu hơn 10.000 tiến trình, hãy điều tra các tác vụ đang chạy của họ. Bạn có thể dọn sạch nhanh bằng pkill:
pkill -u username_here

