使用 lsof 对'Too many files open'进行故障排除



我有一个Java应用程序在Linux上运行,PID为25426。当运行lsof -p 25426时,我注意到:

java    25426 uid  420w  FIFO                0,8      0t0 273664482 pipe
java    25426 uid  421r  FIFO                0,8      0t0 273664483 pipe
java    25426 uid  461r  FIFO                0,8      0t0 273622888 pipe
java    25426 uid  463w  FIFO                0,8      0t0 273633139 pipe
java    25426 uid  464r  FIFO                0,8      0t0 273633140 pipe
java    25426 uid  465r  FIFO                0,8      0t0 273622889 pipe
java    25426 uid  471w  FIFO                0,8      0t0 273623682 pipe
java    25426 uid  472r  FIFO                0,8      0t0 273633141 pipe

这个结果应该如何解释?

我正在排除一个打开文件太多的问题,并试图理解这个观察是否相关。

随着应用程序的继续运行,pipe条目的数量会发生变化(上升和下降)。

定义

  • java -打开文件的进程。
  • 25426 -这应该是真正的PID。如果没有,请通过发布标题让我们知道它是什么。
  • 420 w -文件描述符编号后跟打开的模式。(读/写)
  • 0,8 -主、次设备标识。
  • 273664482 -文件inode。
  • pipe -在应用程序中打开的FIFO管道。
<标题> 解读

您没有关闭所有的流。有许多处于读或写模式的打开文件描述符正在向未命名管道写入。最常见的情况是,人们使用runtime . getrtime .exec(),然后继续保持与进程相关的流打开。您可以使用commons IO utils库关闭它们,也可以自己关闭它们。

    try
    {
        p = Runtime.getRuntime().exec("something");
    }
    finally
    {
        if (p != null)
        {
            IOUtils.closeQuietly(p.getOutputStream());
            IOUtils.closeQuietly(p.getInputStream());
            IOUtils.closeQuietly(p.getErrorStream());
        }
    }

如果这不是问题,您需要深入您的代码库并确定泄漏流的位置并将其插入

最新更新