我目前已将打开文件数限制设置为 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
来自不同的时间,因此它们永远无法完全一致。