![打开的文件太多——如何找到罪魁祸首](https://linux22.com/image/1078363/%E6%89%93%E5%BC%80%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%AA%E5%A4%9A%E2%80%94%E2%80%94%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E7%BD%AA%E9%AD%81%E7%A5%B8%E9%A6%96.png)
运行时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
您可以在以下位置找到更详细的解释......
答案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。