微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用lsof对“打开太多文件”进行故障排除

如何解决使用lsof对“打开太多文件”进行故障排除

定义

  • 打开文件的过程。
  • 这应该是实际的PID。如果没有,请通过发布标题让我们知道它是什么。
  • w-文件描述符编号,后跟打开方式。(读/写)
  • 主要次要设备标识。
  • 文件的inode。
  • -一个FIFO管道是在你的应用程序中打开。

解释

您没有关闭所有流。在读取或写入模式下,有许多打开的文件描述符正在写入未命名的管道。最常见的情况是人们使用Runtime.getRuntime.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());
        }
    }

如果这不是问题,则需要深入研究代码库,确定泄漏的流在何处并将其插入。

解决方法

我在Linux上使用PID 25426运行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条目数也有所不同(向上和向下)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。