前几天查看heka日志的错误日志的时候,发现报错信息 too many open files,很明显打开文件数过多了。shell
第一个问题来了,如何查看当前进程打开的文件数和最大打开文件数呢?日志
当前进程打开文件数 code
ls /proc/[pid]/fd|wc -l
进程
当前进程最大打开文件数cat /proc/[pid]/limits|grep open
it
能够看到以下所示的输出:io
Max open files 1024 4096 files
当前系统最大打开文件数ulimit -n
配置
第二个问题是我该如何修改进程的最大文件打开数呢?
找到最大文件打开数的设置方法,这个问题也就解决了,一般有下面几种修改方式:
1)ulimit -n 102400
直接使用ulimit命令修改,但这个只会对当前会话生效,终端关闭后,设置丢失。
2)/etc/security/limitd.conf
文件中增长limits的配置,通常以下:file
* soft nofile 102400
配置的具体含义,你们自行搜索。/etc/security/limitd.conf
在每个会话建立时都会加载,因此修改这里是一个使配置长期生效的方法。
3)修改shell的启动项,将ulimit -n 102400
放进去,每次建立会话时也会加载。通常是/etc/profile
文件,或者/etc/profile.d/limits.sh
中。搜索
到此为止,配置好了,你经过 ulimit -n
查看系统的最大文件打开数已经生效了。但此时查看进程的最大文件打开数没有变,缘由是这个值是在进程启动的时候设定的,要生效必须重启!supervisor
ok,那就重启吧,重启完毕,结果发现依然没变!这奇了怪了,后来通过很久的排查,最终确认问题是,该程序是经过 supervisord
来管理的,也就是这进程都是 supervisord
的子进程,而 supervisord
的最大文件打开数仍是老的配置,此时必须重启 supervisord
才能够。后来在saltstack上也遇到了一样的问题,必须把全部的 salt-minion 重启。
当你们遇到limits修改不生效的时候,请查一下进程是否只是子进程,若是是,那就要把父进程也一并重启才能够。