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

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

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

# 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的過程當中,當增大開起的進程數後會出現沒法啓動的狀況,產看日誌會有相似的報錯,此時就須要修改最大文件句柄數。vim

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

# 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,這種修改方式只對當前進程有效。若從新打開一個終端或是重啓進程,這個參數都不會生效,因此不建議這樣使用。併發

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

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

(1)系統默認的最大值

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

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

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

# cat /proc/sys/fs/nr_open 
1048576

通常系統默認內核可分配的最大文件數是內存的10%左右,能夠調整到50%左右。rest

# 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

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

# 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)

相關文章
相關標籤/搜索