tail:inotify不能使用,恢复轮询:打开文件太多
当我尝试tail -f catalina.out
,我收到错误:
tail: inotify cannot be used, reverting to polling: Too many open files
我在这篇文章中尝试了答案: 太多打开的文件 – 如何找到罪魁祸首
lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head
当我运行上面的命令时,输出是
17 6115 13 6413 10 6417 10 6415 9 6418 9 6416 9 6414 8 6419 4 9 4 8
我没有看到任何打开1024个文件的进程。 是不是打开17,13,10,10,9的文件数量? 或者我理解错了? 所有这些都是bash,sshd,apache2,tomcat有4号。
我也做了lsof | grep tail | wc -l
lsof | grep tail | wc -l
lsof | grep tail | wc -l
返回20
。 这些数字并不大,为什么tail -f catalina.out
失败?
按照http://peter-butkovic.blogspot.com/2013/08/tail-inotify-resources-exhausted.html上的说明解决了这个问题。
永久解决方案(在重启后保留)添加行:
fs.inotify.max_user_watches=1048576
至:
/etc/sysctl.conf
永久固定限值(即使在重启之间)。
然后做一个
sysctl -p
我认为答案并不完整(它没有说明系统上打开的文件的最大限制)。
关于打开文件的最大数量有两个限制:
-
每个进程打开的文件的最大限制。
- 您可以使用以下命令查看此限制的值:
ulimit -n
- 您可以使用以下命令更改此限制:
ulimit -n new_limit_number
-
这是一个命令,用于获取打开许多文件的前10个进程:
lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head
- 您可以使用以下命令查看此限制的值:
-
每个系统打开的文件的最大限制。
- 您可以使用以下命令查看此限制的值:
cat /proc/sys/fs/file-max
- 您可以使用以下
echo new_limit_number > /proc/sys/fs/file-max
更改此限制:echo new_limit_number > /proc/sys/fs/file-max
- 计算所有打开的文件句柄:
lsof | wc -l
lsof | wc -l
- 您可以使用以下命令查看此限制的值:
最有可能的是,你的inotify
手表耗尽了。 可能你在后台运行一些文件同步工具(例如Dropbox)?
在Linux中, tail -f
命令的内部实现默认使用inotify
机制,以便监视文件更改。 如果您的所有inotify
(默认情况下为8192)已用完,则inotify -f
必须切换到轮询以检测对该文件的更改。
当然,您可以修改inotify
手表的最大数量。
参考:
http://www.quora.com/How-is-tail-f-implemented
http://peter-butkovic.blogspot.com/2013/08/tail-inotify-resources-exhausted.html
https://serverfault.com/questions/510708/tail-inotify-cannot-be-used-reverting-to-polling-too-many-open-files
对于inotify
sysctl fs.inotify.max_user_instances
将获得每个用户的限制。
我经历过,并且所有系统限制都足够高,但默认情况下,用户设置通常相对较低,您可以在sysctl.conf
增加它并通过sysctl -p
重新加载它。
跑
ps aux | grep tail
检查是否有太多的tail命令在运行,例如crontab生成的。
检查你的内核版本,可能是这个bug:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1101666