如何跟踪文件描述符泄漏?


11

我有一个Java进程(Glassfish)正在泄漏文件描述符。我知道这一点是因为我得到了有益的java.io.IOException: Too many open files例外。我可以查看/proc/PID#/fd并查看所有打开的文件描述符。当我使用lsof时,会得到很多这样的条目:

Java 18510根8811u袜子0,4 1576079无法识别协议
Java 18510根8812u袜子0,4 1576111无法识别协议
Java 18510根8813u袜子0,4 1576150无法识别协议

我看到每分钟创建12个新的。我可以在lsof上使用哪些选项,或者可以使用哪些其他工具来帮助跟踪无法识别协议的套接字文件描述符?


//,这个问题的很多解答都不过是搜索引擎的查询而已
Nathan Basanese

Answers:


7

查看使用进程的前20个文件句柄:

for x in `ps -eF| awk '{ print $2 }'`;do echo `ls /proc/$x/fd 2> /dev/null | wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`;done | sort -n -r | head -n 20

输出为格式文件句柄数,进程的pid,cmndline

示例输出

701 1216 /sbin/rsyslogd-n-c5
169 11835 postgres: spaceuser spaceschema [local] idle
164 13621 postgres: spaceuser spaceschema [local] idle
161 13622 postgres: spaceuser spaceschema [local] idle
161 13618 postgres: spaceuser spaceschema [local] idle

4

熟悉strace命令。它监视系统调用。我最近用它来跟踪导致我们的snmpd守护程序反复崩溃的文件描述符泄漏。这需要一些时间来习惯,但这是一个强大的工具。

您可以使用strace附加到正在运行的进程(不要忘记-f标志来跟随子进程)。


1

您到底想追踪什么?与泄漏的FD,错误代码或其他相关的远程IP地址?

您已经确定存在泄漏,因此联系负责此Java流程的工程师似乎是一个合理的下一步。


我试图追踪有关这些文件描述符的所有信息。 can't identify protocol没有给工程师太多帮助。lsof中是否有我没有看到应使用的工具或选项?该问题在测试环境中不会发生,仅在机柜迁移后才在此环境中开始。迁移之前,相同的代码没有问题,并且当取消部署应用程序时,Glassfish仍然会自行泄漏。我最好的猜测是从网络角度来看发生了一些变化,套接字正在尝试初始化,但无法初始化,然后挂起并留在周围。
cclark 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.