我遇到的问题是我的Java应用程序打开了太多文件。调试这个问题,我依赖于使用lsof。 然而,以这种方式运行lsof需要花费太多时间(超过一分钟):
lsof |grep "java"
我应该可以使用-p选项运行它,但它“谎言”。它显示的线条太少。
lsof -p <PID of the java process>
这是我的证据:
lsof |grep java | wc -l
1510146
lsof -p 802 | wc -l
4735
如果我使用-u选项限制用户名(进程所有者),也会发生同样的情况。
我的系统是: Linux 3.16.0-4-amd64#1 SMP Debian 3.16.39-1 + deb8u2(2017-03-07)x86_64 GNU / Linux
我错过了什么吗?有没有替代使用lsof?
答案 0 :(得分:1)
lsof不是说谎。 命令的输出:
lsof |grep java | wc -l
可能包含其他程序打开的文件或进程的结果。
您要搜索的结果是命令的结果:
lsof -p <PID> | wc -l
您可以为运行java应用程序的用户增加打开文件的限制,在/etc/security/limits.conf中添加以下行:
<USER> hard nofile 65536
您可以输入以下内容查看当前用户的限制:
su - <USER>
ulimit -a
答案 1 :(得分:0)
lsof
(不带参数)列出所有打开的文件,包括不使用文件描述符的文件,例如当前工作目录,内存映射的库文件和可执行文本文件。
lsof -p <PID>
列出打开的文件描述符。文件描述符是程序用来获取文件句柄的数据结构,最常见的是标准输入,标准输出和标准错误为0,1,2。
答案 2 :(得分:0)
根据我的观察,似乎
lsof | grep <pid> | wc -l
将给出重复计数,因为指定进程中的每个线程都会添加一行,例如如果您的进程有 8 个线程,则结果将是实际文件数的 8 倍以上。
另一方面,
lsof -p <PID> | wc -l
产生更精确的结果,因为每个文件只计算(打印)一次。
虽然我还没有找到这个问题的官方参考。