当应用进程打开的文件句柄数大于系统设置的句柄数,服务就会报错too many files open,那么如何解决这个问题呢?
1:查看当前系统设置的最大句柄数
命令:ulimit -a;可以看见系统设置的最大句柄数为:65535
2:统计系统中当前打开的总文件句柄数
lsof|awk ‘{print $2}’ |wc -l
3:根据打开文件句柄的数量降序排列,其中第一行是打开的文件句柄数量,第二行是进程号。可以看出来进程28811打开的进程数是:612
命令:lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more
4:开发定位某个应用某块代码某个文件流打开未关闭,给出查找关键词
命令:ps -ef|grep jettyGATEWAY(获取定位到的应用模块jettyGATEWAY的进程号:28811)
命令:ps -ef|grep 28811(查看该应用进程的详细信息,可以查看是哪个应用占用的句柄数最大)
命令:lsof -p 28811|grep homs.pfx(列出所有由某个PID对应的进程打开的文件;开发定位到使获取加签文件,查看文件,如果文件流打开没有关闭则每次发一笔交易用该命令看见的文件数就会加1)
5:设置单个进程句柄数
如果系统并发特别大,单个进程设置的句柄数不合理,这时候就必须要调整系统参数,以适应应用变化。
5.1:临时设置:把当前用户的最大允许打开文件数量设置为2048了,但这种设置方法在重启后会还原为默认值
命令:ulimit -n 2048
5.2:永久设置方法
命令:vim /etc/security/limits.conf ;然后在文件最后加入:* soft nofile 65535、* hard nofile 65535即可生效
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
linux打开文件通常都是open返回一个fd的形式,操作系统会维护当前进程打开文件的记录,但是数量是被限制的,操作系统能打开的fd总和也是有限的,如果进程一直打开文件而不关闭,那么当调用open时操作系统将会返回失败。所以特别实在服务型进程和常驻内存的进程中,打开了文件就要记得在不用时关闭,否则只打开不关闭将会泄露句柄。当然进程结束,操作系统会自己关闭回收fd的,所以如果进程执行时间短就结束了,打开fd少,理论上也可以不显式关闭,但是调用close还是一种良好的习惯。
1:查看某个进程打开的文件文件描述符
/proc/pid/fd文件夹是Linux挂载的记录当前打开文件描述符(fd)信息的,每打开一个fd就会有一个以fd为文件名的文件产生
命令:root用户下:cd /proc/28316(pid)/fd
参考文档:https://blog.csdn.net/oujiangping/article/details/77025953
参考文档:https://www.cnblogs.com/sparkbj/p/7161669.html(lfos常用命令)
参考文档:https://www.cnblogs.com/taosim/articles/2828002.html