1. 程式人生 > >Linux允許打開最大文件句柄數的參數調優-"too many open files"問題

Linux允許打開最大文件句柄數的參數調優-"too many open files"問題

方式 描述 pip lsof 允許 出現 有效 stack awk

都知道Linux系統的特性,一切皆文件,所有在運行zabbix這樣的服務時,其中重要的一個調優就是調整linux系統的最大文件句柄數,解決“too many open files”的問題,增大程序運行允許打開的文件數,提高性能。

一.查看系統運行打開的文件句柄數

# 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) 7179
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7179
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

在默認情況下,open files參數為1024,就是linux允許打開的最大文件數。當運行的服務需要大並發進程運行時,這顯然是不夠的,就會報出“too many open files”。在使用zabbix的過程中,當增大開起的進程數後會出現無法啟動的情況,產看日誌會有類似的報錯,此時就需要修改最大文件句柄數。

二.修改最大文件句柄數-臨時修改

# ulimit -n 2048
# 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) 7179
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7179
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

可以看到open files參數調整到了2048,這種修改方式只對當前進程有效。若重新打開一個終端或是重啟進程,這個參數都不會生效,所以不建議這樣使用。

三.修改最大文件句柄數-內核參數修改

在設置前,我們一定要考慮到系統的限制,如果你修改的參數超過了系統默認值的限制,會帶來另一個悲劇的,此坑踩過。

(1)系統默認的最大值

file-max是內核可分配的最大文件數

# cat /proc/sys/fs/file-max 
181044

nr_open是單個進程可分配的最大文件數

# cat /proc/sys/fs/nr_open 
1048576

一般系統默認內核可分配的最大文件數是內存的10%左右,可以調整到50%左右。

# grep MemTotal /proc/meminfo |awk ‘{printf("%d",$2/10)}‘
186726

(2)調整最大值

修改兩個內核文件中允許的最大值,需要註意的是nr_open中的參數要小於file-max中的參數。
系統允許的最大值調整為內存的50%。

# grep MemTotal /proc/meminfo |awk ‘{printf("%d",$2/2)}‘
933632
# echo 933632 > /proc/sys/fs/file-max 

單個進程可分配的最大值適當增大。

# echo 233632 > /proc/sys/fs/nr_open

(3)修改系統內核參數

# vim /etc/security/limits.conf
*   soft     nofile      65535
*   hard     nofile      65535
# vim /etc/security/limits.d/20-nproc.conf
*   soft     nproc       65535
*   hard    nproc       65535

這裏的“*”號表示對所有用戶生效,可以設置指定的用戶,修改後保存退出,帶看一個新的終端就可生效了。

(4)總結

a.所有進程打開的文件描述符數不能超過/proc/sys/fs/file-max
b.單個進程打開的文件描述符數不能超過user limit中nofile的soft limit
c.nofile的soft limit不能超過其hard limit
d. nofile的hard limit不能超過/proc/sys/fs/nr_open

(5)特別提醒

有一種意外情況,如果沒有註意修改系統默認允許的最大值,在limits.conf中設置的參數大於系統默認值,推出終端後,你會發現ssh無法鏈接的悲劇,此時如果你還有未關閉的終端鏈接,那恭喜你還有拯救的余地,修改sshd的配置文件。

# vim /etc/ssh/sshd_config
UsePAM yes 將這裏的yes改為no

重啟sshd服務
#systemctl restart sshd.service
此時可以鏈接終端了,調整系統內核允許的最大值,再改回sshd的配置。

四.關於打開文件的查看命令

(1)查看所有進程的文件打開數

# lsof |wc -l

(2)查看整個系統目前使用的文件句柄數

# cat /proc/sys/fs/file-nr

(3)查看某個進程開的進程

#lsof -p pid

(4)查看某個進程的的文件句柄數

#lsof -p pid|wc -l

(5)查看某個目錄,文件被什麽進程占用

#lsof path(file)

Linux允許打開最大文件句柄數的參數調優-"too many open files"問題