看到太多的lsof无法识别协议

2022-09-01 23:29:59


我有一个Java进程/应用程序。当我在java进程上运行/usr/sbin/lsof -p时,我看到很多“无法识别协议”。此外,有趣的是,文件描述符(FD)正在以非常稳定的速度增加。那些正在创建的FD被描述为“无法识别协议”。

那么,有没有办法检测/分析java进程,以便确定谁在创建那么多FD。对任何工具的任何详细解释都会非常有帮助。

快速的谷歌搜索告诉我,strace是一种方式,但IIUC,它将显示来自java进程的linux系统调用。我更感兴趣的是我的java代码的哪一部分表现得很糟糕,而不是正在生成什么系统调用。

同样,任何想法/建议都很棒!


答案 1

半开 TCP/IP 连接的 Lsof 打印:https://idea.popcount.org/2012-12-09-lsof-cant-identify-protocol/can't identify protocol


答案 2

当lsof打印“无法识别协议”时,这通常与套接字有关(它还应该在相关输出行中说“sock”)。

因此,在代码中的某个位置,您可能正在连接套接字并且没有正确关闭它们(也许您需要一个最终块)。

我建议您使用调试器(最容易使用IDE,如果需要,可能使用远程调试器)单步执行代码,同时并行运行lsof。您最终应该能够看到哪个线程/代码行正在创建这些文件描述符。

有关 Lsof 输出的更多详细信息,请参阅本常见问题解答的第 10.2.2 点。