都知道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
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
修改兩個內核文件中容許的最大值,須要注意的是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
# 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
這裏的「*」號表示對全部用戶生效,能夠設置指定的用戶,修改後保存退出,帶看一個新的終端就可生效了。進程
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
有一種意外狀況,若是沒有注意修改系統默認容許的最大值,在limits.conf中設置的參數大於系統默認值,退出終端後,你會發現ssh沒法連接的悲劇,此時若是你還有未關閉的終端連接,那恭喜你還有拯救的餘地,修改sshd的配置文件。
# vim /etc/ssh/sshd_config UsePAM yes 將這裏的yes改成no
重啓sshd服務#systemctl restart sshd.service
此時能夠連接終端了,調整系統內核容許的最大值,再改回sshd的配置。
# lsof |wc -l
# cat /proc/sys/fs/file-nr
#lsof -p pid
#lsof -p pid|wc -l
#lsof path(file)