已达到内核 inotify 监视限制

Ult*_*der 247 linux kernel 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'.` 
Run Code Online (Sandbox Code Playgroud)

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

sudo sysctl fs.inotify.max_user_watches=<some random high number>
Run Code Online (Sandbox Code Playgroud)

但我无法找到任何有关提高该价值的后果的信息。我猜默认内核值的设置是有原因的,但它似乎不适用于特定用途。(例如,当使用带有大量文件夹的 Dropbox 或监控大量文件的软件时)

所以这里是我的问题:

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

tsh*_*ang 345

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

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

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

要检查 inotify 手表的最大数量:

cat /proc/sys/fs/inotify/max_user_watches
Run Code Online (Sandbox Code Playgroud)

设置 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 手表的最大数量:

在任何旧文件上tail-f(follow) 选项一起使用,例如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
Run Code Online (Sandbox Code Playgroud)

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

  • “永久:替换 /proc/sys/fs/inotify/max_user_watches 中的值”&lt;-- 这是不正确的。要使其*永久*,您需要更改`/etc/sysctl.conf` (7认同)
  • `我想很少有代码需要高于默认值的值` Dropbox 可能需要更高的限制,具体取决于您拥有的文件数量。我提出了我的没有问题。事实上,保管箱通知(在达到其限制时发生)明确告诉您提高它。 (5认同)
  • sysctl != systemd,在您的解释中。并且`/etc/sysctl.d` 也适用于较新的基于 RedHat 的系统。 (4认同)
  • @ultrasawblade- inotify 取代了 dnotify。dnotify 很慢而且有问题。inotify 可用于目录,当目录中的一个文件(深一层)被修改时,该目录将被“更改”。无论如何,目录只是文件。 (2认同)

小智 5

在另一个主题“如何获取正在使用的 inotify 监视的数量”中,有一个对这个脚本inotify-consumers的引用,我发现它非常有帮助,因为它会准确地向您显示谁在占用监视程序。