打开的文件太多——如何找到罪魁祸首

打开的文件太多——如何找到罪魁祸首

运行时tail -f filename,我收到以下消息:

tail: inotify cannot be used, reverting to polling: Too many open files

这是一个潜在的问题吗?

我如何诊断导致所有打开文件的原因?我有一个可疑进程列表,但如果它们不是罪魁祸首,那么不依赖于知道要检查哪个进程的指令将很有用。

答案1

您可以使用 lsof 来了解谁打开了这么多文件。通常是 (web) 服务器打开了这么多文件,但 lsof 肯定能帮助您找出原因。

一旦你明白谁是坏人你就可以

  • 终止进程/停止程序
  • 提高 ulimit

如果 lsof 的输出非常大,请尝试将其重定向到文件,然后打开该文件

示例(你可能必须Ctrl+C第一个命令)

lsof > ~/Desktop/lsof.log
cat ~/Desktop/lsof.log | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20
vim ~/Desktop/lsof.log

答案2

万一其他人需要它......

ulimit -a

将显示所有当前限制。具体来说,ulimit -n 70000将设置文件描述符限制。

还...

cat /proc/sys/fs/file-max

如果编辑的话将显示/设置内核限制。

sudo echo 200000 > /proc/sys/fs/file-max

您可以在以下位置找到更详细的解释......

如何增加非 root 用户的打开文件限制?

答案3

ulimit用于确定允许打开的文件数每个进程你可能想找出罪魁祸首。

@itsadok @Tyler Collier @gaoithe 在对其他答案的评论中强调,对哪个进程打开了最多的文件进行排序和计数是这里最好的做法:

sudo lsof | head -1 | awk '{ print "COUNT " $2 " " $1; }' && sudo lsof +c 0 | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20

上述命令:

  • 为输出提供标题
  • lsof给出打开文件列表
  • +c 0选项指示lsof打印完整命令
  • awk '{ print $2 " " $1; }'在结果中打印 PID 和 COMMAND 列
  • sort -rn对结果进行排序,使相同的条目彼此相邻(uniq -c正常工作所需)
  • uniq -c统计通过 PID/命令打开的文件数
  • sort -rn按计数对结果进行排序
  • head -20显示按 PID/命令打开的前 20 个文件

注意:这将计算不计入限制的“文件”

你可能希望通过查看 PID 的限制、特定 PID 打开的文件数以及lsof仅计算计入限制的文件数来进一步调查 - 请参阅https://serverfault.com/a/964752/152562

相关内容