Làm cách nào có thể tìm được giá trị ulimit cho một tài khoản user hoặc một tiến trình trên hệ thống Linux?
Để hoạt động đúng, chúng ta phải đảm bảo rằng các giá trị ulimit chính xác được thiết lập sau khi cài đặt các phần mềm khác nhau. Hệ thống Linux cung cấp các phương tiện để hạn chế số lượng tài nguyên được sử dụng. Mỗi tài khoản người dùng Linux sẽ được đặt những limit (giới hạn) khác nhau. Hệ thống limit được áp dụng riêng cho từng tiến trình của mỗi người dùng. Ví dụ, nếu ngưỡng nhất định quá thấp, hệ thống không thể lưu trữ các trang web bằng cách sử dụng các app Nginx/Apache hoặc PHP/Python. Giới hạn tài nguyên hệ thống được xem hoặc đặt bằng lệnh NA. Hãy cùng tìm hiểu xem làm thế nào để sử dụng ulimit cung cấp quyền kiểm soát các tài nguyên có sẵn cho shell và các tiến trình.
Cách tìm ulimit cho người dùng trên Linux
Lệnh ulimit Linux đặt hoặc hiển thị giới hạn tài nguyên tiến trình người dùng. Thông thường, các giới hạn được tìm thấy trong tệp /etc/security/limits.conf hoặc systemd.
Hai loại giới hạn
Tất cả các giới hạn Linux đều được chia làm hai loại:
- Soft limit: Tất cả người dùng có thể thay đổi soft limit, tối đa theo hard limit. Đổi sang -S cho ulimit.
- Hard limit: Chỉ root user mới được phép thay đổi hard limit. Đổi sang -H cho ulimit.
Xem các ulimit cho tài khoản người dùng của Linux
Nhập lệnh sau để xem tất cả các soft và hard limit cho người dùng hiện tại:
ulimit -Sa ## Show soft limit ##
ulimit -Ha ## Show hard limit ##
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 126787
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1048576
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) unlimited
cpu time (seconds, -t) unlimited
max user processes (-u) 126787
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Liệt kê tất cả các hard ulimit cho người dùng tên ‘tom’
Bạn phải chạy lệnh sau với tư cách là root user hoặc ít nhất có quyền truy cập vào tài khoản đó thông qua sudo/su:
su - tom -c "ulimit -Ha"
su - tom --shell /bin/bash -c "ulimit -Ha"
## You can use the sudo command ##
sudo -u tom bash -c "ulimit -Ha"
sudo -u tom sh -c "ulimit -Ha"
Tìm tất cả các soft ulimit cho người dùng tên ‘jerry’
Làm như trên một lần nữa:
su - jerry -c "ulimit -Sa"
su - jerry --shell /bin/sh -c "ulimit -Sa"
## You can use the sudo command ##
sudo -u jerry bash -c "ulimit -Sa"
sudo -u jerry sh -c "ulimit -Sa"
Tìm kiếm “ulimit-a” cho process user
Một tiến trình Linux là phiên bản đang chạy của một chương trình. Ví dụ, khi bạn khởi động ứng dụng Firefox, bạn đã tạo một tiến trình. Tuy nhiên, một số tiến trình đã chạy nền trong hệ thống khá lâu. Thông thường, với tiến trình chạy nền, bạn không thể sử dụng lệnh sudo hoặc su để tìm limit của chúng. Ở đây, nginx đang chạy như www-data user trên Debian Linux, nhưng shell bị chặn truy cập vào tài khoản www-data user theo mặc định vì lý do bảo mật. Nói cách khác, lệnh su/sudo sau đây sẽ thất bại 100%.
$ su - www-data -c "ulimit -Sa"
This account is currently not available.
Cách tìm ulimit cho một tiến trình
Công thức:
cat /proc/PID/limits
Trước tiên hãy tìm PID (ID tiến trình) cho nginx, chạy lệnh ps cùng với lệnh grep:
ps aux | grep nginx
Kết quả ví dụ:
root 8868 0.0 0.0 127044 24048 ? Ss May23 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 18074 0.0 0.0 127276 24716 ? S May23 0:09 nginx: worker process
www-data 18075 0.0 0.0 127276 22284 ? S May23 0:00 nginx: worker process
Bây giờ gõ lệnh cat:
cat /proc/8868/limits
Kết quả ví dụ:
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes unlimited unlimited processes
Max open files 1024 1048576 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 385944 385944 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
Hầu hết các lập trình viên và sysadmin cần biết số lượng tiến trình tối đa và các file mở trên mỗi tiến trình nginx. Tóm lại, chúng ta tìm thấy PID bằng cách sử dụng ”ps aux | grep appname”, sau đó tìm những file “limits” của PID đó trong tệp /proc/. Sau đó, bạn sẽ biết chắc chắn những giá trị nào nên áp dụng để điều chỉnh hiệu suất.