回答您的问题

回答您的问题

我在 Debian 服务器上运行的一个进程开始抛出套接字:打开的文件太多错误。然后我开始调试错误。我经历了以下场景。

当我运行时lsof | grep 4300,输出如下在此输入图像描述

当我运行时lsof -i TCP:4300,输出是

在此输入图像描述

现在的问题是:

  1. 他们两个有什么区别呢? (我的观察是第一个有线程 ID,而后一个没有)

  2. 为什么第一个连接中的同一个连接有多条线? (SS 仅给出 4 行。)

  3. 打开了多少个文件描述符?

  4. 如何调试这个场景?

答案1

我正在参考lsof 的联机帮助页对于我的回答。

lsof | grep 4300

如果没有任何选项,lsof 会列出属于所有活动进程的所有打开文件。

因此,此命令列出了属于所有进程的所有打开文件,您已通过管道输出其输出以grep仅搜索与搜索操作数“4300”匹配的文件。

lsof -i TCP:4300 

此选项选择其 Internet 地址与 i 中指定的地址匹配的文件列表。如果未指定地址,则此选项将选择所有 Internet 和 x.25 (HP-UX) 网络文件的列表。

使用此命令,您已指定只希望列出具有 Internet 地址或网络位置的文件,并进一步指定您只希望那些与端口 4300 上的 tcp 协议匹配的文件。

回答您的问题

  1. 这两个命令的结果不同,第一个命令是列出所有打开的文件,但输出被 grep 过滤到所有包含“4300”的行。第二个命令指定仅打开在端口 4300 上使用 tcp 协议的 Internet 或网络文件。

  2. 根据这个帖子您的进程可以简单地多次打开该文件。这并不是意外的行为lsof。这绝对是你的问题,我会研究每个进程正在做什么以及为什么它们需要打开这些文件的多个副本。

  3. 如果您已包含命令的所有输出,则与第一个命令相比,将有 3 个进程将各自的文件打开 5 次。在第二个命令中,有 3 个进程在端口 4300 上使用 tcp 协议打开网络文件,还有一个进程正在侦听该协议和端口。

  4. 我会研究每个进程是基于 pid 的。参考文献这个帖子您可以使用以下命令通过 pid 查找进程:ps -p <PID> -o comm=。或者,我在ps aux | grep <PID>确定流程方面取得了很大的成功。

结论

从这里,您将需要查找这是否是流程的预期行为,以及如果它们是初始错误的原因,则如何补救。不要忘记引用可能与错误和进程关联的任何日志。

如果对此答案有任何误解或疑问,请发表评论。我将根据需要编辑这篇文章以改进答案。

祝你好运!

相关内容