gpt4 book ai didi

Linux 文件描述符

转载 作者:太空狗 更新时间:2023-10-29 11:43:23 24 4
gpt4 key购买 nike

我有一个 Java 程序平均运行 2 周后会卡住并产生以下错误:

Caused by: java.net.SocketException: Too many open files
at sun.nio.ch.Net.socket0(Native Method)
at sun.nio.ch.Net.socket(Net.java:415)
at sun.nio.ch.Net.socket(Net.java:408)
at sun.nio.ch.SocketChannelImpl.<init>(SocketChannelImpl.java:105)

这向我暗示许多套接字已打开但从未关闭。在深入研究编程工具之前,我开始检查我可以从 Linux 本身获取哪些信息。我正在使用 Redhat。

然后,出现了以下几个问题:

  1. 为什么以下命令不会给出相同的输出?

[ec2-user@ip-172-22-28-102 ~]$ sudo ls /proc/32085/fd | wc -l
592
[ec2-user@ip-172-22-28-102 ~]$ sudo lsof -a -p 32085 | wc -l
655
  1. 有没有办法从 proc stat 信息中知道哪个线程创建了哪个文件描述符?

似乎没有,因为如果我执行以下操作,我会得到相同的信息:

[ec2-user@ip-172-22-28-102 ~]$ sudo ls /proc/32085/task/22386/fd | wc -l
592
[ec2-user@ip-172-22-28-102 ~]$ sudo ls /proc/32085/fd | wc -l
592

如果我直接从/proc/下转到线程,则相同。

谢谢

最佳答案

Is there a way to know from the proc stat info which thread created which file descriptor?

我很确定这里的答案是“否”。文件描述符由进程打开,而不是线程(并且对同一进程产生的所有线程可见)。

Why the following commands do not give the same output?

首先,-a lsof 的参数在这种情况下似乎是空操作。具体来说,这个人说它“导致列表选择选项被 AND 运算,如上所述”。所以你真的只是在运行:

sudo lsof -p 32085

这将打印打开文件描述符以外的内容(例如内存映射文件、当前工作目录等),同时 /proc/<PID>/fd只包含打开的文件描述符。所以你会得到不同的结果,因为你要求的是不同的信息。

关于Linux 文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32332553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com