Tôi đã tăng Number of Open File Limit trong CentOS thế nào

Cám ơn -T - Giữa những ngày tháng 7, tôi nhận thấy & nhận được những băn khoăn của mấy bạn developer về open file limits trên CentOS. Vẫn là câu chuyện muôn thửa, chương trình viết xong chạy trên máy tính của tôi được. Tại sao chạy trên server lại chết?

Những băn khoăn của họ trở thành băn khoăn của tôi, một người làm Linux System.

"Open file limits"

định nghĩa số lượng file mà người dùng có thể mở với mỗi phiên đăng nhập Linux. Đây là một thiết lập mặc định và có thể khác nhau phụ thuộc vào hệ điều hành Linux bạn đang dùng.

Trước tiên, tôi cần tìm hiểu những khái niệm:

  • ulimits
  • hard limits
  • soft limits
  • soft stack
  • hard stack

ulimits

cung cấp kiểm soát các tài nguyên Linux System cho mỗi người dùng thông qua shell. Có thể nhập ulimit -a để có danh sách các thiết lập hiện tại.

[tien@tien-phan ~]# ulimit -a
core file size          (blocks, -c) 0  
data seg size           (kbytes, -d) unlimited  
scheduling priority             (-e) 0  
file size               (blocks, -f) unlimited  
pending signals                 (-i) 385913  
max locked memory       (kbytes, -l) 64  
max memory size         (kbytes, -m) unlimited  
open files                      (-n) 64000  
pipe size            (512 bytes, -p) 8  
POSIX message queues     (bytes, -q) 819200  
real-time priority              (-r) 0  
stack size              (kbytes, -s) 10240  
cpu time               (seconds, -t) unlimited  
max user processes              (-u) 64000  
virtual memory          (kbytes, -v) unlimited  
file locks                      (-x) unlimited  

Để biết chi tiết hơn về ý nghĩa của mỗi thiết lập, tôi có thể chọn 1 trong 2 nơi sau

  • [tien@tien-phan ~]# man ulimit
  • hoặc cat /etc/security/limits.conf

hard limits

là số open file tối đa cho phép mỗi người dùng mở trong phiên đăng nhập. Nó được thiết lập bởi superuser/ root. Giá trị này được thiết lập trong file /etc/security/limits.conf.

soft limits

là giá trị có thể thiết lập & hiệu quả ngay lập tức cho user. User có thể tự thay đổi giá trị này phù hợp với nhu cầu của họ, nhưng giá trị thiết lập cho soft limit không được cao hơn hard limit.

người dùng có thể thay đổi giá trị mặc định "soft" limits? bằng cách thêm dòng sau vào shell startup file (ví dụ: .bashrc, .bash_profile, .cshrc, .profile, v.v..., shell script)

ulimit -S -s 8192  

Ở ví dụ trên, người dùng thay đổi soft limit cho stack size lên 8192.

có thể thay đổi giá trị mặc định soft limits và hard limits cho user? superuser/ root vào /etc/security/limits.conf để thiết lập.

Làm thế nào để thay đổi Open File Limit?

(trong bài viết này, tôi tăng Open File Limits lên 64000)
Bước 1: thay đổi giá trị trong file limits.conf

$sudo vim /etc/security/limits.conf

*         soft   nofile            64000
*         hard   nofile         64000

Tôi muốn thay đổi max number of open file descriptors nên item là nofile, bạn nên tham khảo bảng sau để biết cụ thể từng giá trị

#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
#
#Where:
#<domain> can be:
#        - a user name
#        - a group name, with @group syntax
#        - the wildcard *, for default entry
#        - the wildcard %, can be also used with %group syntax,
#                 for maxlogin limit
#
#<type> can have the two values:
#        - "soft" for enforcing the soft limits
#        - "hard" for enforcing hard limits
#
#<item> can be one of the following:
#        - core - limits the core file size (KB)
#        - data - max data size (KB)
#        - fsize - maximum filesize (KB)
#        - memlock - max locked-in-memory address space (KB)
#        - nofile - max number of open file descriptors
#        - rss - max resident set size (KB)
#        - stack - max stack size (KB)
#        - cpu - max CPU time (MIN)
#        - nproc - max number of processes
#        - as - address space limit (KB)
#        - maxlogins - max number of logins for this user
#        - maxsyslogins - max number of logins on the system
#        - priority - the priority to run user process with
#        - locks - max number of file locks the user can hold
#        - sigpending - max number of pending signals
#        - msgqueue - max memory used by POSIX message queues (bytes)
#        - nice - max nice priority allowed to raise to values: [-20, 19]
#        - rtprio - max realtime priority

Bước 2: (tùy chọn làm hay không) thay đổi max number of processes

$sudo vim /etc/security/limits.d/90-nproc.conf

# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     64000
root       soft    nproc     unlimited  

Qua hai bước trên, bạn đã thay đổi giá trị Open File Limits. Nhưng giá trị này chỉ thể hiện đúng với người dùng interactive, non-login shell, không áp dụng cho người dùng login shell như ssh.

Cần hiểu rõ, sau những thay đổi trên là đủ. Và nó đã được áp dụng. Bằng chứng là khi su qua user khác bạn sẽ thấy con số là 64000. Và từ giờ, chúng ta không bàn về chuyện tăng như thế nào nữa? mà bàn về chuyện là vì sao ssh vào thì nó không đổi giá trị thành 64000 còn su thì đổi thành 64000, điều gì quyết định những cái này?

Sự khác nhau giữa ssh user@machinesu user là gì?

File đầu tiên mà hệ thống đọc để thiết lập biến môi trường cho user là /etc/environment. Sau đó, file được đọc phụ thuộc vào cách mà bash được viện dẫn (gọi đến để tham khảo). Khi bạn ssh user@machine, login shell được gọi. Khi bạn su user, bạn sẽ gọi interactive, non-login shell.

Có thể kiểm tra sự khác biệt environment bằng cách dùng $PATH

Để có cái nhìn chi tiết hơn về interactive shell và login shell, bạn vui lòng tham khảo bài viết An Explanation of .bashrc and .bash_profile

Bash man page

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of /etc/bash.bashrc and ~/.bashrc.  

Làm thế nào để ssh user@machine nhận Open File Limits như su user

Quay trở lại trường hợp khi tôi nhận ulimit khác nhau giữa ssh user@machinesu user. Bạn vừa đọc đoạn trên tôi viết về interactive shelllogin shell. Nhưng nó có tác động đến sự khác biệt ở trên không?

Câu trả lời là không. Vậy tại sao tôi lại nhắc đến chúng? đơn giản vì tôi để cơ hội cho tôi và bạn có thêm hoặc củng cố kiến thức về interactive shell & non-interactive shell (login shell).

Suy nghĩ lại về luồng đi của một user khi đăng nhập Linux System
user -> ssh > SSHD -> PAM Service -> /etc/pam.d/sshd

Với /etc/pam.d/sshd như dưới, ulimit giữa ssh user@machinesu user đã đồng nhất

Tới đây, có 2 việc bạn cần làm:
(1) sửa UsePAM thành yes trong /etc/ssh/sshd_config
(2) thêm dòng session required pam_limits.so vào /etc/pam.d/sshd

#%PAM-1.0
auth    include system-auth  
account include system-auth  
session include system-auth  
account    required     pam_nologin.so  
session    required     pam_limits.so  
cattek@HO-LAP-10:~$ ssh root@tien-phan  
[root@tien-phan pam.d]# less /etc/pam.d/sshd
[root@tien-phan pam.d]# ulimit -S
unlimited  
[root@tien-phan pam.d]# su - pass
[pass@tien-phan ~]$ ulimit -S
unlimited  

cattek@HO-LAP-10:~$ ssh pass@tien-phan  
[pass@tien-phan ~]$ ulimit -S
unlimited  
[pass@tien-phan ~]$ 

File Descriptors (FD)

Bên cạnh Open File Limits, tôi cũng cần có kiến thức về File Descriptor /etc/sysctl.conf. FD (system file descriptor limit) số File Descriptor enforced ở kernel level, cái mà không thể vượt qua bởi tất cả process mà không gia tăng nó. ulimits là enforce ở mức process level, và có giá trị nhỏ hơn file-max.
Để thay đổi giá trị FD, bạn cần cẩn trọng xem xét dựa trên một daemon cụ thể, có thể là Database hoặc Web Server. Bởi nếu bạn loại bỏ hoàn toàn giới hạn, daemon đó có khả năng lấy hết tài nguyên hệ thống và làm cho hệ thống bị lỗi.

Kết luận

Trong bài viết này, tôi đã hướng dẫn bạn tăng Open File Limits. Nếu bạn là người mới bắt đầu, tôi có niềm tin bài viết giúp ích cho bạn. Tôi rất vui khi bạn đọc tới đây.

Lời cám ơn

Tôi cám ơn bạn đã dành thời gian để đọc bài viết này. Tất nhiên, tôi luôn quan tâm đến hoàn thiện chất lượng bài viết, vì vậy mọi sự đóng góp của bạn là sự khích lệ đối với tôi.

Bài viết thể hiện quan điểm, văn phong của tác giả. Mọi sự tranh luận, phản biện được khuyến khích. Và tôi bảo lưu mọi quan điểm cho đến khi mọi thứ được sáng tỏ trên cơ sở sự chính xác của thông tin.

Tài liệu tham khảo

http://hacktux.com/bashrc-bashprofile/
https://www.cyberciti.biz/tips/linux-pam-configuration-that-allows-or-deny-login-via-the-sshd-server.html
https://serverfault.com/questions/191238/the-difference-between-etc-pam-d-login-and-etc-pam-d-system-auth
https://www.ibm.com/support/knowledgecenter/en/SSZJPZ
9.1.0/com.ibm.swg.im.iis.found.admin.common.doc/topics/wsisinstconfigpam_exp.html
https://serverfault.com/questions/122679/how-do-ulimit-n-and-proc-sys-fs-file-max-differ
https://superuser.com/questions/570170/environment-using-su-vs-ssh-usermachine-as-a-user-on-lucid

Tien Phan

Read more posts by this author.

Subscribe to

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!