![为什么 lsof -p 和 lsof 返回的结果截然不同?](https://linux22.com/image/1529977/%E4%B8%BA%E4%BB%80%E4%B9%88%20lsof%20-p%20%E5%92%8C%20lsof%20%E8%BF%94%E5%9B%9E%E7%9A%84%E7%BB%93%E6%9E%9C%E6%88%AA%E7%84%B6%E4%B8%8D%E5%90%8C%EF%BC%9F.png)
我目前已将打开文件数限制设置为 100000,但 lsof 报告说该限制已接近用完。
运行lsof -n | awk '{print $2'} | sort | uniq -c | sort -n
结果:
1 PID
90321 3979
几乎相同的结果lsof -n | grep 3979 | wc -l
但跑步lsof -n -p 3979 | wc -l
却带来完全不同的东西
3930
计算文件数量/proc/3979/fd/
也会返回较小的结果。
答案1
我认为在这个问题出现的时候,有一个有缺陷的 lsof 版本在流传。其中包括 ubuntu bionic。该版本的 lsof 的问题在于它总是显示线程视图,并且该视图无法关闭。lsof 版本:
- 4.86(ubuntu trusty)默认显示进程视图。-K 表示线程
- 4.89(ubuntu bionic)默认显示线程视图。无法关闭。
- 4.91 (debian buster) 默认显示线程视图。-Ki 表示进程
/proc 文件系统一直是我的最爱:
ls -d /proc/[1-9]*/fd/*|cut -d/ -f3|sort |uniq -c |sort -rn|head
答案2
我查看了我的系统上的日志dropbox
并发现了类似的差异。
当我详细查看各个日志时,我发现dropbox
显示有 400 个文件使用 打开lsof -p
,而 23500 个文件使用 打开ls ... | grep '^dropbox'
查看长列表,我发现dropbox
有 60 个线程,并且每个线程中报告了大多数基本 400 个文件,从而解释了差异。
我不知道线程中的文件句柄是在共享内存中还是线程独有的。在打开文件限制中,共享内存中的文件句柄不应被计算多次。
我计算线程数的命令是:
lsof -n | grep "^dropbox " | awk '{print $3}' | uniq | wc -l
如果您的应用程序行为类似,则下面的数字就是现实的数字。
请注意,所有数字都是近似值:我忽略了何时将标题行包含在计数中以及将基本 PID 包含在线程计数中。由于报告ls
来自不同的时间,因此它们永远无法完全一致。