各位帮我看看 linux /proc/[pid]/fd 文件夹下为什么会产生大量的句柄数,每天都在增加最后导致超过最大句柄数量而失败,当前pid为一个java web应用
java web应用中打开fd不回收导致的。检查代码啊
Proc是一个虚拟文件系统,在Linux系统中它被挂载于/proc目录之上。Proc有多个功能 ,这其中包括用户可以通过它访问内核信息或用于排错,这其中一个非常有 用的功能,也是Linux变得更加特别的功能就是以文本流的形式来访问进程信息。很Linux命令(比如 ps、toPpstree等)都需要使用这个文件系统的信息。
proc 是一个伪文件系统, 被用作内核数据结构的接口, 而不仅仅是解释说明/dev/kmem.
/proc 里的大多数文件都是只读的, 但也可以通过写一些文件来改变内核变量.
fd:
此目录包含进程打开的所有文件,文件名为文件描述符,目录中每个软连接都会指向进程打开的实际文件。
比如:nginx下:
root@iZ23onhpqvwZ:/proc/22210/fd# ll
total 0
dr-x------ 2 root root 0 Oct 20 17:39 ./
dr-xr-xr-x 9 root root 0 Oct 20 17:22 ../
lrwx------ 1 root root 64 Oct 20 17:39 0 -> /dev/null
lrwx------ 1 root root 64 Oct 20 17:39 1 -> /dev/null
lrwx------ 1 root root 64 Oct 20 17:39 10 -> socket:[2917559817]
l-wx------ 1 root root 64 Oct 20 17:39 2 -> /opt/nginx/logs/error.log
l-wx------ 1 root root 64 Oct 20 17:39 3 -> /opt/nginx/logs/access.log
lrwx------ 1 root root 64 Oct 20 17:39 6 -> socket:[2917557592]
lrwx------ 1 root root 64 Oct 20 17:39 7 -> socket:[2917557593]
l-wx------ 1 root root 64 Oct 20 17:39 8 -> /opt/nginx/logs/error.log
lrwx------ 1 root root 64 Oct 20 17:39 9 -> socket:[2917559816]
limits:
该文件存储了进程的软限制,硬限制等信息。
可以查看该进程允许打开的最大描述字个数。
短期可以通过ulimit 调整或者重启服务器,长期check代码吧,肯定有fd泄漏问题
文件句柄泄露了,检查代码,打开文件、socket、通道等句柄后没有关闭,Linux文件系统都是以文件句柄形式存在
使用lsof -p pid|wc -l显示程序占用的文件句柄数,一直增长说明fd泄露,检查代码,尤其是异常情况下句柄关闭。
肯定是fd泄露了。我们也碰到这种情况,楼主最后找到原因了吗