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 

我认为答案并不完整(它没有说明系统上打开的文件的最大限制)。

关于打开文件的最大数量有两个限制:

  1. 每个进程打开的文件的最大限制。

    • 您可以使用以下命令查看此限制的值: ulimit -n
    • 您可以使用以下命令更改此限制: ulimit -n new_limit_number
    • 这是一个命令,用于获取打开许多文件的前10个进程:

       lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head 
  2. 每个系统打开的文件的最大限制。

    • 您可以使用以下命令查看此限制的值: 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