运行时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 肯定会帮助你找出原因。
一旦你明白谁是坏人,你就可以
如果 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)
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)
更详细的解释可以在...
虽然可用于确定每个进程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。
归档时间: |
|
查看次数: |
234025 次 |
最近记录: |