我如何知道我是否已经超出了 inotify 监视范围?

我如何知道我是否已经超出了 inotify 监视范围?

我使用了一个使用 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 位系统上为两倍)[来源:12]
  • 这来自内核内存,这是不可交换的。
  • 因此,假设你将最大值设置为 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 消耗。


相关文章inotify

相关内容