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

ccl*_*ark 12 lsof max-file-descriptors

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

java 18510 root 8811u sock 0,4 1576079 无法识别协议
java 18510 root 8812u sock 0,4 1576111 无法识别协议
java 18510 root 8813u sock 0,4 1576150 无法识别协议

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

小智 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
Run Code Online (Sandbox Code Playgroud)

输出格式为 file handle count, pid, cmndline for process

示例输出

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
Run Code Online (Sandbox Code Playgroud)


An̲*_*rew 1

你究竟想追踪什么?与泄露的 FD、有缺陷的代码或其他内容相关的远程 IP 地址?

由于您已经发现存在泄漏,因此联系负责此 java 流程的工程师似乎是合理的下一步。