用更短、更集中的问题再试一次。请注意,这不是通常的“为什么 file-nr 报告的数字低于我的预期”的问题。我有相反的问题。
Linux 2.6 系统正在泄漏文件句柄。我知道这一点,因为我定期 cat /proc/sys/fs/file-nr。第一个数字在几个小时内趋于上升,第二个数字始终为 0。当第一个数字达到第三个时,登录变得不可能,没有新的 shell,等等。所以我相信 file-nr 的输出并且有理由相信有重大的文件句柄泄漏。(系统并不总是这样做,我们还没有找到导致它开始发生的原因或原因,但它相当普遍。)
现在奇怪的部分。以 root 身份运行,我通过 /proc/each 进程 id/fd 对所有 fd 执行 ls -l。请注意,我以 root 身份执行此操作,因此我应该看到所有进程的所有文件句柄。
根据我有限的理解, ls 的输出应该显示与 file-nr 显示的句柄数量大致相同。我不希望它是准确的,因为进程可能会来来去去,他们可能会在我走 /proc/# 时打开或关闭文件。但是完成了足够多的时间,我预计平均而言,粗略的协议。所以第一个问题是,这是一个合理的假设吗?如果不是,为什么不呢?
我之所以问,是因为 file-nr 显示了缓慢增加的句柄数,向 65536 前进。但是 /proc/ids../fd 的汇总输出显示的句柄数减少了数千。例如,在某一时刻,file-nr 看起来像“9900 0 65536”,但计算 proc 中每个进程的文件句柄数少于 2000,并且反复进行,它或多或少保持不变。任何泄漏的句柄都不会显示为一个过程。
相差7000多?当进程没有疯狂地启动和停止并且不应该疯狂地打开和关闭文件时?请注意,每个进程的硬文件句柄限制为 1024,因此并不是任何一个进程导致了这种情况。系统确实显示了几十个已失效的进程,但我认为已失效的进程不能保留文件句柄。而且我让其他人很难检查我的工作,所以这似乎不是对 ls 或任何东西的愚蠢滥用。
这对我来说是一个关键问题,如果有人能解释为什么在计数方面存在如此大的分歧,它可以让我走上解决关键和生产停止问题的轨道。
注意我没有使用 lsof - 它已从系统中删除。但由于我只对实际文件句柄感兴趣,这可能与“打开文件”不同,因此步行 /proc/#s 应该足够好。或者我是这么想的。
事实证明,至少在 Linux 2.6 中,已失效的进程有可能保留文件句柄。我不知道怎么做,但是当我们强行清理失效的 sshd 进程时,句柄计数又下降了。