当前位置: 首页>>技术教程>>正文


如何判断我是否出于inotify watch ?

, , ,

问题描述

我使用的是消耗inotify watch 的应用程序。我有already set

fs.inotify.max_user_watches=32768

/etc/sysctl.conf但是昨晚应用程序停止了索引,除非我手动运行它,这导致我怀疑我没有 watch 。

因为我不知道当我增加这个数字时会有什么折衷(它会消耗更多的RAM吗?),我不知道我是否应该增加这个数字,所以我想知道我是否有办法可以判断它是否正在使用所有这些 watch 以及可能会增加它的权衡。

最佳解决思路

你怎么知道你是不是 watch ?尾巴会告诉!

  • 在任何旧文件上使用-f(跟随)选项启动tail,例如: tail -f /var/log/dmesg

    • 如果一切顺利,它将显示最后10行并暂停;用Ctrl-C中止

    • 如果您没有 watch ,它将失败,这个somewhat cryptic error:尾巴:无法观看’/var/log/dmsg’:设备上没有剩余空间

对于好奇:为什么尾部是”telltail”?

  • 实际上,任何well-written app都应该礼貌地告诉你,因为inotify API /调用清楚地告诉他们这笔交易是什么。

  • 请尝试使用strace tail -f ...,当它成功时,它以:inotify_add_watch(4,”/var/log/dmesg”,IN_MODIFY …)= 1结束

  • 但如果它失败了,即你没有 watch ,它会说:inotify_add_watch(4,”/var/log/dmesg”,IN_MODIFY ..)= -1 ENOSPC(设备上没有剩余空间)

你能增加 watch 吗?多少钱?任何权衡?

简短的回答:当然,没有汗水。如果您需要,请直接转到half-million(524288)…在具有4GB +内存的现代系统上,使用的额外内存应该可以忽略不计。

  • 每个使用的inotify watch 占用540字节(32位系统),或1 kB(双倍 – 64位)[来源:12]

  • 这来自内核内存,这是不可逆转的。

  • 因此,假设您将最大值设置为524288,并且所有都被使用(不太可能),那么您将使用约。 256MB /512MB的32位/64位内核内存

    • 请注意,您的应用程序还将使用额外的内存来跟踪inotify句柄,文件/目录路径等 – 多少取决于其设计。

  • 什么是最大值?理论上,我认为只要你有足够的RAM。在实践中,524288 has been officially recommended by apps,人们已经将其设置为200万,当然伴随着内存使用。

次佳解决思路

我不知道是否应该增加这个数字

检查您是否达到max_user_watches值的简便方法是,与您的用户一起使用inotify-tools软件包中的inotifywatch,并检查您是否仍然可以从文件中收集信息。

例如我的inotifywatch -v /home/bruno/.profile返回:

Establishing watches...
Total of 1 watches.
Finished establishing watches, now collecting statistics.

所以inotify创建新 watch 没有问题,这里没有问题。

如果你已经达到inotify watch 的最大限制,它将返回类似的东西

Failed to watch /home/bruno/.profile; upper limit on inotify watches reached!

如果你看到这样的东西,那么你已达到极限并需要增加允许的 watch 限制。

它消耗更多RAM吗?

是的,它确实。但是根据这个old article,与正在运行的桌面的其他方面相比,它消耗的数量是最小的。

–MEMORY USAGE–

The inotify data structures are light weight:

inotify watch is 40 bytes inotify device is 68 bytes inotify event is 272 bytes

So assuming a device has 8192 watches, the structures are only going to consume 320KB of memory. With a maximum number of 8 devices allowed to exist at a time, this is still only 2.5 MB

Each device can also have 256 events queued at a time, which sums to 68KB per device. And only .5 MB if all devices are opened and have a full event queue.

So approximately 3 MB of memory are used in the rare case of everything open and full.

Each inotify watch pins the inode of a directory/file in memory, the size of an inode is different per file system but lets assume that it is 512 byes.

So assuming the maximum number of global watches are active, this would pin down 32 MB of inodes in the inode cache. Again not a problem on a modern system.

我当然假设自从撰写文章以来事情没有发生太大的变化,但是看看我不担心的数字并且增加限制不会增加RAM的消耗。


有关inotify的相关帖子

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6224.html,未经允许,请勿转载。