Linux下Too many open files問題排查與解決

做者:bash

Greysocket

原文地址:rest

Githubcode

語雀blog

博客園進程

Too many open files是Linux系統中常見的錯誤,從字面意思上看就是說程序打開的文件數過多,不過這裏的files不單是文件的意思,也包括打開的通信連接(好比socket),正在監聽的端口等等,因此有時候也能夠叫作句柄(handle),這個錯誤一般也能夠叫作句柄數超出系統限制。引發的緣由就是進程在某個時刻打開了超過系統限制的文件數量以及通信連接數。ip

經過命令ulimit -a能夠查看當前系統設置的最大句柄數是多少get

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31767
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) 31767
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

能夠看到,open files的配置是1024,能夠經過以下命令將open files增長博客

ulimit -n 65535

這種修改方式能夠臨時把文件打開數量增長到65535,可是系統重啓後這個配置會失效。it

還有一種方式是修改系統的配置文件,以Ubuntu爲例,配置文件默認在

/etc/security/limits.conf

在這個配置文件中增長

* soft nofile 65535
* hard nofile 65535

此外,若是用supervisor託管和啓動項目,會遇到這個配置沒法生效的問題,緣由在於supervisor會默認配置打開的句柄數量是1024,

若是要查看某個進程最大open files,能夠經過這個進程的進程號對應的limits查看

cat /proc/進程號/limits

其中有一行是:

Max open files	1024	1024	bytes

supervisor託管的程序這一行默認都是supervisor配置的最大數量1024,這時須要手動改一下supervisor的配置文件,修改方式以下,以Ubuntu系統爲例,找到supervisor的配置文件supervisord.conf

在[supervisord]選項中,增長minfds選項的配置

[supervisord]
minfds=65535                  ; min. avail startup file descriptors; default 1024

配置完畢後,須要重啓supervisor(以systemctl爲例)

systemctl restart supervisor

便可生效

在經過:

cat /proc/進程號/limits

查看下對應進程的可open files的數量

Max open files	65535	65535	bytes
相關文章
相關標籤/搜索