Centos排除too many open files的问题
简介最近在使用Centrifugo的项目的时候,当连接数比较多的是时候,出现了“too many open files”的错误。本文主要记录如何排除和优化该问题。
当出现“too many open files”错误的时候,我们应该先从两个方面进行查找问题;
1、查看系统文件限制
cat /etc/sysctl.conf
查看如下配置是否合理:
fs.file-max = 1000000
2、查看用户级的文件限制
cat /etc/security/limits.conf
查看如下配置是否合理:
* soft nofile 655350 * hard nofile 655350
如果上述两个配置都没有问题,并且比较合理,那么我们还需要查看下进程自身能打开多大的文件数
3、单独获取程序文件数限制
[root@online log]# cat /proc/31804/limits #31804就是进程ID Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 31215 31215 processes Max open files 1024 4096 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 31215 31215 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
从中可以看出,Max open files的文件数为1024,这是为什么呢?然后对系统启动该进程的方式找到了问题,这个进程通过supervisor启动的,所以是否跟supervisor有关呢?然后查看了/etc/supervisord.conf配置文件,里面确实有如下的配置:
minfds=1024 ; min. avail startup file descriptors; default 1024 minprocs=200 ; min. avail process descriptors;default 200
那么我们将这两个配置改成合理的数值。这里我们都修改成了100000;修改完后需要重启supervisor,但是通过如下命令配置文件是不会生效的:
supervisorctl reload
所以我们需要通过如下两条命令来重启supervisor:
supervisorctl shutdown #先停止 supervisord -c /etc/supervisord.conf; #再启动
下面我们再来看下启动的进程的信息:
[root@online log]# cat /proc/6261/limits #这里对应的进程ID已经发生了变化 Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 1000000 1000000 processes Max open files 1000000 1000000 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 31215 31215 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
从上面显示的内容可以看出,Max open files已经修改成功了。
4、统计系统进程打开文件数,并进行从多到少排序
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more