当前位置: 首页 > 面试题库 >

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

栾景胜
2023-03-14
问题内容

我在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条目数也有所不同(向上和向下)。


问题答案:
  • java- 打开文件的过程。
  • 25426- 这应该是实际的PID。如果没有,请通过发布标题让我们知道它是什么。
  • 420 w-文件描述符编号,后跟打开方式。(读/写)
  • 0,8- 主要次要设备标识。
  • 273664482- 文件的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());
        }
    }

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



 类似资料:
  • 问题内容: 如何检查服务器上发送的邮件有问题?我运行一个简单的测试: 测试输出哪个文本;但是,没有邮件到达。 我该如何追踪问题? 问题答案: 这是一个很长的故事。一些要点(假设mail()返回true,并且错误日志中没有错误): 发件人地址(“发件人”)是否属于您服务器上的域?如果不是,请这样做。 您的服务器是否列入黑名单(例如,在spamhaus.org上检查IP)?共享托管的可能性很小。 邮件

  • 问题内容: 对Windows上的锁定文件进行故障排除 问题答案: Jetty会为Web应用程序缓冲静态内容,例如HTML文件,CSS文件,图像等。如果你使用的是NIO连接器,Jetty将使用内存映射文件来执行此操作。问题是在Windows上,内存映射文件会导致文件锁定,因此你无法更新或替换文件。实际上,这意味着你必须停止Jetty才能更新文件。 Remedy Jetty提供了一个配置开关,用于De

  • 问题内容: 我已经按照本教程http://www.dsl.uow.edu.au/~sk33/php5java.htm进行了操作,但最后还是尝试了 我有这个例外 PHP致命错误:未捕获[o(Exception):“ java.lang.Exception:CreateInstance失败:new HelloWorld。原因:java.lang.ClassNotFoundException:在java

  • 问题内容: 我的Java程序失败了 这是来自的关键行。他们将用户的最大文件数设置为500k: 我跑去统计打开的文件数- 包括全局和jvm进程。我检查了中的柜台。一切似乎还可以。我的进程仅打开了4301个文件,限制为500k: 这是Ubuntu 11.04服务器。我什至已经重新启动,所以我很肯定正在使用这些参数。 我不知道它是否相关,但是该过程由upstart脚本启动,该脚本使用setuidgid启

  • 问题内容: 我有一个名为Main.java的Java程序,它位于以下目录中: 当我尝试从“程序”目录运行Main.java时,一切正常,我使用了以下行: 但是当我尝试从主目录运行Main.java时: 我得到: 此错误的原因是什么? 问题答案: 这是由于您的类路径所致,该类路径将默认为当前目录。从中运行时,在当前目录中找到该类(因为该软件包似乎未设置,这意味着它是默认值)。因此,它在中找到类。 从

  • 问题内容: 我正在使用子进程来调用另一个程序,并将其返回值保存到变量中。循环重复此过程,经过数千次后程序崩溃,并出现以下错误: 任何解决该问题的想法都非常感谢! 注释提供的代码: 问题答案: 我猜问题是由于我正在处理带有子进程的打开文件: 在此,cmd变量包含刚刚创建但尚未关闭的文件的名称。然后,在该文件上调用系统命令。多次执行此操作后,程序崩溃并显示该错误消息。 所以我从中学到的信息是 关闭您创