我使用了一个使用 inotify 监视的应用程序。我已经设定
fs.inotify.max_user_watches=32768
但是/etc/sysctl.conf
昨晚应用程序停止了索引,除非我手动运行它,这让我怀疑我已经没有手表了。
因为我不知道增加这个数字时的权衡是什么(它会消耗更多的 RAM 吗?),我不知道是否应该增加这个数字,所以我想知道是否有办法判断它是否正在使用所有这些监视,以及增加它的权衡是什么。
答案1
如何知道手表是否用完了?尾巴会告诉!
tail
从-f
任何旧文件上的 (follow) 选项开始,例如tail -f /var/log/dmesg
:- 如果一切顺利,它将显示最后 10 行并暂停;使用 Ctrl-C 中止
- 如果你的手表数量已用完,这将失败有点神秘的错误:
tail:无法监视‘/var/log/dmsg’:设备上没有剩余空间
好奇的人:为什么尾巴一个“告密者”?
- 实际上,任何 编写良好的应用程序应该礼貌地告诉你,因为通知API/calls 清楚地告诉他们交易是什么。
- 请尝试
strace tail -f ...
一下,如果成功,则结果为:inotify_add_watch(4,“/ var / log / dmesg”,IN_MODIFY ...)= 1
- 但如果失败了,即你的手表数量已用完,它会说:
inotify_add_watch(4,“/ var / log / dmesg”,IN_MODIFY ..) = -1 ENOSPC(设备上没有剩余空间)
你能增加手表数量吗?增加多少?有什么权衡吗?
简短回答:当然,没问题。如果您愿意,可以直接转到 50 万(524288)...使用的额外内存应该在具有 4GB+ 内存的现代系统上可以忽略不计。
- 每个用过的inotify watch 占用 540 字节(32 位系统)或 1 kB(64 位系统上为两倍)[来源:1,2]
- 这来自内核内存,这是不可交换的。
因此,假设你将最大值设置为 524288,并且所有内存都已使用(不太可能),则你将使用大约 256MB/512MB 的 32 位/64 位内核内存
- 请注意,您的应用程序还将使用额外的内存来跟踪 inotify 句柄、文件/目录路径等——具体数量取决于其设计。
最大值是多少?我猜理论上没有,只要你有足够的 RAM。实际上,524288已获得应用程序官方推荐,人们已经将其设置为200 万,当然还伴随着内存的使用。
答案2
我不知道是否应该增加这个数字
检查是否达到值的简单方法max_user_watches
是,与您的用户一起使用inotifywatch
包中的inotify-tools
,并检查是否仍然可以从文件中收集信息。
例如inotifywatch -v /home/bruno/.profile
对于我来说返回:
Establishing watches...
Total of 1 watches.
Finished establishing watches, now collecting statistics.
因此,inotify
创建新手表没有问题,这里也没有问题。
如果你已经达到 inotify 监视的最大限制,它将返回类似的内容
Failed to watch /home/bruno/.profile; upper limit on inotify watches reached!
如果您看到类似这样的情况则表示您已达到限制,并且需要增加允许的监视限制。
它会消耗更多 RAM 吗?
是的。但是根据这个旧文章与正在运行的桌面的其他方面相比,它所消耗的量是最小的。
- 内存使用情况 -
inotify 数据结构是轻量级的:
inotify watch 为 40 字节 inotify device 为 68 字节 inotify event 为 272 字节
因此,假设一台设备有 8192 个监视点,这些结构仅会消耗 320KB 内存。如果最多允许同时存在 8 个设备,则这仍然只有 2.5 MB
每个设备一次还可以排队 256 个事件,每个设备总计 68KB。如果所有设备都打开并且事件队列已满,则只有 0.5 MB。
因此,在所有内容都打开且已满的罕见情况下,将使用大约 3 MB 的内存。
每个 inotify 监视将目录/文件的 inode 固定在内存中,每个文件系统的 inode 大小不同,但我们假设它是 512 字节。
因此,假设最大数量的全局监视处于活动状态,这将限制 inode 缓存中的 32 MB inode。在现代系统上,这也不是问题。
我当然假设自从撰写这篇文章以来情况并没有发生太大变化,但看看这些数字,我不会担心,而且增加限制不会增加太多的 RAM 消耗。