我目前在 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
- Debian/红帽:
- 您可能希望重新加载 sysctl 设置以避免重新启动:
sysctl -p
(Debian/RedHat)或sysctl --system
(Arch)
检查 inotify 监视的最大数量是否已达到:
在任何旧文件上使用(follow)tail
选项,例如: - 如果一切顺利,它将显示最后 10 行并暂停;使用 Ctrl-C 中止 - If-f
tail -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
答案2
来自另一个主题如何获取正在使用的inotify手表的数量有一个对此脚本的引用inotify-消费者我发现这非常有帮助,因为它会告诉你到底是谁在霸占观察者。