为什么 lsof -p 和 lsof 返回的结果截然不同?

为什么 lsof -p 和 lsof 返回的结果截然不同?

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

相关内容