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"問題