达到内核inotify监视限制


206

我目前在linux机器上遇到问题,因为我已经以root身份返回了返回错误的命令,因为已经达到了inotify监视限制。

# tail -f /var/log/messages
[...]
tail: cannot watch '/var/log/messages': No space left on device
# inotifywatch -v /var/log/messages
Establishing watches...
Failed to watch /var/log/messages; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via '/proc/sys/fs/inotify/max_user_watches'.` 

我用谷歌搜索了一下,发现的每个解决方案都是通过增加以下限制:

sudo sysctl fs.inotify.max_user_watches=<some random high number>

但是我找不到任何有关提高价值的后果的信息。我猜默认的内核值设置是有原因的,但是对于特定的用法似乎并不足够。(例如,在具有大量文件夹的Dropbox或监视大量文件的软件中使用)

所以这是我的问题:

  • 提升该价值是否安全?价值过高会带来什么后果?
  • 有没有办法找出当前设置的手表是什么,以及通过哪些过程设置它们,以便能够确定达到的限制不是由软件故障引起的?

您已经检查了此文件,因为已使用8个月了,但是驱动器已满吗?“尾巴:无法观看'/ var / log / messages':设备上没有剩余空间”
froggythefrog

Answers:


273

提升该价值是否安全?价值过高会带来什么后果?

是的,提高价值很安全,以下是可能的成本[ 来源 ]:

  • 每个使用的inotify手表占用540个字节(32位系统),或1 KB(双-在64位)[来源:12 ]
  • 这是从内核内存中出来的,它是不可交换的。
  • 假设您将最大值设置为524288,并且全部使用(不可能),那么您将使用大约256MB / 512MB的32位/ 64位内核内存。
    • 请注意,您的应用程序还将使用额外的内存来跟踪inotify句柄,文件/目录路径等。多少取决于其设计。

要检查有声手表的最大数量:

cat /proc/sys/fs/inotify/max_user_watches

设置最大手表数量

暂时:

  • 最后sudo sysctl fs.inotify.max_user_watches=以您的首选值运行。

永久(更详细的信息):

  • 放入fs.inotify.max_user_watches=524288您的sysctl设置。根据您的系统,它们可能位于以下位置之一:
    • Debian / RedHat: /etc/sysctl.conf
    • 拱门:将新文件放入/etc/sysctl.d/,例如/etc/sysctl.d/40-max-user-watches.conf
  • 您可能希望重新加载sysctl设置以避免重启:sysctl -p(Debian / RedHat)或sysctl --system(Arch)

检查是否已达到inotify手表的最大数量:

tail-f任何旧文件的(跟随)选项一起使用,例如tail -f /var/log/dmesg:-如果一切正常,它将显示最后10行并暂停;使用Ctrl-C中止-如果您不在监视范围内,它将因以下隐秘错误而失败:

尾巴:无法观看'/ var / log / dmsg':设备上没有剩余空间

看看inotify手表用完了什么

find /proc/*/fd -lname anon_inode:inotify |
   cut -d/ -f3 |
   xargs -I '{}' -- ps --no-headers -o '%p %U %c' -p '{}' |
   uniq -c |
   sort -nr

第一列表示的inotify FDS的数目(未虽然手表的数量)和第二显示的该过程中的PID [来源:12 ]。


3
I guess very few codes need the values higher than the defaultDropbox可能需要更高的限制,具体取决于您拥有多少文件。我没有问题地提出了我的要求。实际上,Dropbox通知(在达到其限制时会发生)明确地告诉您提高它。
法尔玛里

1
@ ultrasawblade- inotify替换为dnotify。dnotify缓慢且有故障。inotify可以在目录上使用,并且修改目录中的文件之一(深一层)后,该目录将被“更改”。目录只是文件。
beatgammit

6
“永久:替换/ proc / sys / fs / inotify / max_user_watches中的值” <-这是不正确的。为了使这个永久性的,你需要改变/etc/sysctl.conf
芝加哥商业交易所

3
sysctl!= systemd,在您的解释中。并且/etc/sysctl.d还可以在较新的基于RedHat的系统上运行。
aairey

1
@stackexchanger如果您非常确定它们相似(例如,您已经测试过),那么请提交并编辑问题。我自己尚未检查,我知道发行版倾向于修补软件包,因此相同软件包的行为可能有所不同。更不用说软件包版本的差异了。
tshepang
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.