Cấu hình ulimit Linux là bước thường bị bỏ qua sau khi cài OS mới — cho đến khi Docker container báo lỗi kết nối, nginx crash không rõ lý do, hoặc Kubernetes pod bị OOMKilled dù RAM còn đủ. Bài viết giải thích cơ chế, hướng dẫn cấu hình đúng cho Docker và Kubernetes, kèm script tự động hóa toàn bộ quá trình.

ulimit Là Gì Và Tại Sao Cần Cấu Hình ulimit Linux?
ulimit là cơ chế Linux giới hạn tài nguyên mà một tiến trình người dùng có thể sử dụng. Các tham số quan trọng nhất:
- nofile — số lượng file descriptor tối đa (bao gồm socket, file, pipe). Mỗi kết nối mạng tiêu tốn một file descriptor
- nproc — số lượng tiến trình con tối đa có thể tạo
- memlock — dung lượng bộ nhớ có thể lock trong RAM
- stack — kích thước stack tối đa của tiến trình
Giá trị mặc định trên nhiều bản Linux là nofile=1024 — quá thấp cho các ứng dụng production. Một nginx xử lý 1000 kết nối đồng thời đã cần ít nhất 1000 file descriptor, cộng thêm các file log và socket nội bộ.
Kiểm tra giá trị hiện tại:
|
1 2 |
ulimit -a |
Cấu Hình ulimit Linux Ảnh Hưởng Docker Như Thế Nào?
Docker daemon và toàn bộ container chạy dưới nó đều kế thừa giới hạn ulimit từ OS. Nghĩa là nếu OS đặt nofile=1024, mọi container — dù bạn không cấu hình gì trong Docker — cũng chỉ được dùng tối đa 1024 file descriptor.
Hậu quả thực tế:
- Container nginx, Redis, MongoDB báo lỗi too many open files khi tải cao
- Container không tạo được kết nối mạng mới dù còn RAM và CPU
- Lỗi xuất hiện không nhất quán, khó reproduce vì chỉ xảy ra khi đạt giới hạn
Cấu Hình ulimit Cho Toàn Hệ Thống
Thêm vào /etc/security/limits.conf:
|
1 2 3 4 5 |
* soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535 |
File này áp dụng cho các session login qua PAM. Với systemd, cần cấu hình thêm ở /etc/systemd/system.conf:
|
1 2 3 |
DefaultLimitNOFILE=65535 DefaultLimitNPROC=65535 |
Cấu Hình ulimit Riêng Cho Docker Daemon
Tạo file override cho Docker service:
|
1 2 |
sudo mkdir -p /etc/systemd/system/docker.service.d |
Tạo file /etc/systemd/system/docker.service.d/override.conf:
|
1 2 3 4 |
[Service] LimitNOFILE=65535 LimitNPROC=65535 |
Áp dụng:
|
1 2 3 |
sudo systemctl daemon-reexec sudo systemctl restart docker |
Cấu Hình ulimit Linux Cho Kubernetes
Kubernetes không expose ulimit trực tiếp trong Pod spec. Thay vào đó, kubelet và container runtime (containerd, CRI-O) kế thừa giới hạn từ OS. Nếu nofile thấp ở mức OS, toàn bộ node sẽ bị ảnh hưởng:
- Node lỗi khi số pod tăng cao vì mỗi pod tạo nhiều file descriptor và process
- Pod bị OOMKilled không phải do hết RAM mà do hết nproc — khó phân biệt với OOM thực
- containerd hoặc kubelet crash khi số lượng socket internal vượt nofile
Cấu Hình ulimit Cho kubelet
Tạo file /etc/systemd/system/kubelet.service.d/10-ulimit.conf:
|
1 2 3 4 |
[Service] LimitNOFILE=65535 LimitNPROC=65535 |
Áp dụng:
|
1 2 3 4 |
sudo systemctl daemon-reexec sudo systemctl daemon-reload sudo systemctl restart kubelet |
Script Tự Động Cấu Hình ulimit Cho Docker Và Kubernetes
Script bên dưới tự động phát hiện Docker và kubelet có đang chạy không, áp dụng cấu hình tương ứng:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/bash # setup_ulimit.sh — Cấu hình ulimit cho hệ thống chạy Docker/Kubernetes set -e echo "Đang cấu hình /etc/security/limits.conf ..." cat </dev/null; then sudo systemctl restart docker fi if systemctl is-active kubelet.service &>/dev/null; then sudo systemctl restart kubelet fi echo "Cấu hình ulimit hoàn tất. Logout/login hoặc reboot để áp dụng hoàn toàn." |
Chạy script:
|
1 2 3 |
chmod +x setup_ulimit.sh sudo ./setup_ulimit.sh |
Tổng Kết
Cấu hình ulimit Linux đúng cách ngay sau khi cài OS là bước không thể thiếu trước khi triển khai Docker hoặc Kubernetes. Giá trị an toàn cho môi trường production là nofile=65535 và nproc=65535 — đủ cho hầu hết workload mà không gây rủi ro cho hệ thống. Bỏ qua bước này sẽ dẫn đến các lỗi không nhất quán, khó reproduce và khó chẩn đoán khi hệ thống đạt tải cao.
Tham khảo thêm tài liệu chính thức về resource limit trong Linux tại kernel.org.
Xem thêm các bài viết về hệ thống tại tungle.blog và chuyên mục Hệ thống, hoặc bài cài đặt APISIX cluster HA trên Linux để tham khảo thêm về cấu hình môi trường production.
Bạn đang dùng giá trị ulimit bao nhiêu trên hệ thống production? Gặp lỗi gì liên quan đến ulimit chưa? Để lại bình luận bên dưới.