达到内核 inotify 监视限制

达到内核 inotify 监视限制

我目前在 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 或监控大量文件的软件时)

这是我的问题:

  • 提高该值是否安全?过高的值会产生什么后果?
  • 有没有办法找出当前设置的手表是什么以及哪个进程设置了它们,以便能够确定达到的限制是否不是由错误的软件引起的?

答案1

提高该值是否安全?过高的值会产生什么后果?

是的,提高该值是安全的,下面是可能的成本[来源]:

  • 每个用过的inotify watch 占用 540 字节(32 位系统)或 1 kB(64 位系统上的双倍)[来源:1,2]
  • 这来自于内核内存,这是不可交换的。
  • 假设您将最大值设置为 524288 并且全部都已使用(不太可能),那么您将使用大约 256MB/512MB 的 32 位/64 位内核内存。
    • 请注意,您的应用程序还将使用额外的内存来跟踪 inotify 句柄、文件/目录路径等——多少取决于其设计。

要检查 inotify 监视的最大数量:

cat /proc/sys/fs/inotify/max_user_watches

设置 inotify 监视的最大数量

暂时地:

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

永久 (更详细的信息):

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

检查 inotify 监视的最大数量是否已达到:

在任何旧文件上使用(follow)tail选项,例如: - 如果一切顺利,它将显示最后 10 行并暂停;使用 Ctrl-C 中止 - If-ftail -f /var/log/dmesg你的手表没了,它会失败有点神秘的错误:

tail:无法观看“/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 fd 的数量(但不是监视的数量),第二列显示该进程的 PID [来源:1,2]。

答案2

来自另一个主题如何获取正在使用的inotify手表的数量有一个对此脚本的引用inotify-消费者我发现这非常有帮助,因为它会告诉你到底是谁在霸占观察者。

相关内容