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

And*_*imm 80 filesystem

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

tail: inotify cannot be used, reverting to polling: Too many open files
Run Code Online (Sandbox Code Playgroud)

这是一个潜在的问题吗?

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

And*_*ato 79

您可以使用 lsof 来了解谁打开了这么多文件。通常它是一个(网络)服务器打开这么多文件,但 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
Run Code Online (Sandbox Code Playgroud)

  • 对于懒人:`lsof | awk '{ 打印 $2; }' | uniq -c | 排序 -rn | 头` (45认同)
  • 对打开的最多文件进行排序和计数绝对是最好的选择。显示进程名称以及 pid: '''lsof | awk '{ 打印 $2 " " $1; }' | 排序 -rn | uniq -c | 排序 -rn | 头-20''' (22认同)
  • 我发现itsadok 的行很有帮助,但我认为你应该先排序(因为`uniq` 只适用于相邻的行),运行 uniq,然后再次排序。所以`lsof | awk '{ 打印 $2; }' | 排序 -rn | uniq -c | 排序 -rn | 头`。 (16认同)
  • @gaoithe 如果你把它放到答案中,我会很乐意为它点赞`:)` (2认同)

ker*_*vin 31

万一其他人需要它...

ulimit -a
Run Code Online (Sandbox Code Playgroud)

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

还...

cat /proc/sys/fs/file-max
Run Code Online (Sandbox Code Playgroud)

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

sudo echo 200000 > /proc/sys/fs/file-max
Run Code Online (Sandbox Code Playgroud)

更详细的解释可以在...

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

  • ulimits 在那里,所以你可以严格控制系统中的资源使用。对于您知道将需要使用许多文件描述符的进程,最好单独增加它们。通过让它们在测试中保持紧密,您会发现随着时间的推移可能会不断泄漏文件描述符的进程。另请注意,文件句柄用于 unix/linux 中的任何设备访问。例如,进程打开的每个网络套接字都使用一个文件句柄。这解释了为什么在常规文件系统文件以及任何设备文件(如网络连接)的情况下,您会遇到“打开的文件太多”。 (4认同)

bbo*_*ler 7

虽然可用于确定每个进程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