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


69

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

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

那是潜在的问题吗?

如何诊断所有打开文件的原因?我有一个可疑流程的列表,但是如果事实并非如此,那么不依赖于要检查哪个流程的说明将很有用。


1
您是否增加了通过提供的文件描述符的数量ulimit
伊格纳西奥·巴斯克斯

2
@ IgnacioVazquez-Abrams这可能对其他用户有帮助,但对我来说,感觉就像是在治疗症状,而不是疾病。
安德鲁·格林

尽管您没看错,但有时应用程序有充分的理由打开许多文件。
伊格纳西奥·巴斯克斯

Answers:


71

您可以使用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

37
对于懒惰者:lsof | awk '{ print $2; }' | uniq -c | sort -rn | head
itsadok 2012年

1
我遇到同样的错误,使用ulimit不起作用。tail -F命令仍然返回错误。我将限制从1024增加到3000,所以我可以想象那时我有足够的空间...我想我必须重新启动!
Alexis Wilke 2013年

15
我发现itsadok的行很有用,但是我认为您应该首先进行排序(因为uniq仅适用于相邻的行),运行uniq,然后再次进行排序。所以lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head
Tyler Collier

19
对打开的最多文件进行排序和计数绝对是最好的选择。显示进程名称以及pid:'''lsof | awk'{print $ 2“” $ 1; }'| 排序-rn | uniq -c | 排序-rn | 头-20'''
gaoithe 2014年

2
@gaoithe如果您回答,我会很乐意赞成:)
Matt Ball

23

万一其他人需要它...

ulimit -a

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

也...

cat /proc/sys/fs/file-max

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

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

可以在...上找到更详细的解释。

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


3
ulimit在那里,因此您可以严格控制系统中的资源使用。对于需要使用许多文件描述符的进程,最好分别增加它们。通过严格测试它们,您会发现随着时间的推移可能会不断泄漏文件描述符的进程。还要注意,文件句柄用于unix / linux中的任何设备访问。例如,进程打开的每个网络套接字都使用文件句柄。这就解释了为什么在常规文件系统文件以及任何设备文件(例如网络连接)的情况下都可以打“打开的文件太多”的原因。
gaoithe 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.