故障排除“打开的文件太多”与lsof的(Troubleshooting 'Too many

2019-08-22 01:45发布

我有一个PID 25426.运行在Linux上运行Java应用程序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条目变化(上升和下降)。

Answer 1:

定义

  • 爪哇 -用打开文件的过程。
  • 25426 -这应该是真正的PID。 如果没有,请让我们知道它是由发布标题是什么。
  • 420瓦特 -文件描述符号,接着是它与打开模式。 (读/写)
  • 0,8 -主要和次要设备标识。
  • 273664482 -文件的索引节点。
  • -一个FIFO管道是在你的应用程序中打开。

解释

您不关闭所有的流。 有在写这封信是未命名管道读取或写入模式许多打开的文件描述符。 最常见的情形要做到这一点,是当人们使用Runtime.getRuntime.exec() ,然后继续保持与过程相关联的开放式流。 您可以使用公共IO utils的库来关闭它们 ,也可以自行关闭它们 。

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

如果这不是问题,你需要深入到你的代码库,并查明漏流是将插头。



文章来源: Troubleshooting 'Too many files open' with lsof