如何判断我是否用完了 inotify 手表?

Jor*_*tro 57 kernel files inotify

我使用了一个消耗 inotify 手表的应用程序。我已经设置了

fs.inotify.max_user_watches=32768
Run Code Online (Sandbox Code Playgroud)

/etc/sysctl.conf但昨晚的应用程序停止索引,除非我手动运行它,这使我怀疑我的手表了。

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

ish*_*ish 73

你怎么知道你是否没有手表?尾巴会告诉你!

  • 从任何旧文件tail-f(follow) 选项开始,例如tail -f /var/log/dmesg
    • 如果一切顺利,它将显示最后 10 行并暂停;使用 Ctrl-C 中止
    • 如果您不在手表中,它将因这个有点神秘的错误而失败:
      尾巴:无法观看“/var/log/dmsg”:设备上没有剩余空间

对于好奇:为什么tail是“telltail”?

  • 实际上,任何 编写良好的应用程序都应该有礼貌地告诉您,因为inotify API/调用清楚地告诉他们交易是什么。
  • 试试吧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 手表占用 540 字节(32 位系统),或 1 kB(双 - 64 位)[来源:1 , 2 ]
  • 这来自内核内存,这是不可交换的。
  • 因此,假设您将最大值设置为 524288,并且都使用了(不太可能),那么您将使用大约。256MB/512MB 的 32 位/64 位内核内存

    • 请注意,您的应用程序还将使用额外的内存来跟踪 inotify 句柄、文件/目录路径等——多少取决于其设计。
  • 最大值是多少?我想理论上没有,只要你有足够的内存。在实践中,524288已经被app官方推荐了,人们一直设置为200万,当然也伴随着内存使用。

  • 如果您还想知道当前 inotify 手表的实际数量(因此更多的是是/否),请选择 `sudo lsof | grep -i inotify | wc -l` (8认同)
  • “精心编写的应用程序”链接已损坏。 (2认同)

Bru*_*ira 13

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

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

例如inotifywatch -v /home/bruno/.profile对我来说返回:

Establishing watches...
Total of 1 watches.
Finished establishing watches, now collecting statistics.
Run Code Online (Sandbox Code Playgroud)

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

如果您已达到 inotify 手表的最大限制,它将返回类似

Failed to watch /home/bruno/.profile; upper limit on inotify watches reached!
Run Code Online (Sandbox Code Playgroud)

如果您看到类似这样的内容,那么您已达到限制,需要增加允许的手表限制。

它会消耗更多的内存吗?

是的,它确实。但是根据这篇旧文章,与正在运行的桌面的其他方面相比,它消耗的量很小。

- 内存使用情况 -

inotify 数据结构是轻量级的:

inotify 手表是 40 字节 inotify 设备是 68 字节 inotify 事件是 272 字节

所以假设一个设备有 8192 个手表,这些结构只会消耗 320KB 的内存。一次最多允许存在 8 个设备,这仍然只有 2.5 MB

每个设备还可以同时排队 256 个事件,总计为每个设备 68KB。如果所有设备都打开并且有一个完整的事件队列,则只有 0.5 MB。

因此,在极少数情况下所有内容都打开且已满的情况下,将使用大约 3 MB 的内存。

每个 inotify 监视都将内存中目录/文件的 inode 固定,每个文件系统的 inode 大小不同,但假设它是 512 个字节。

因此,假设最大数量的全局监视处于活动状态,这将在 inode 缓存中固定 32 MB 的 inode。在现代系统上再次不是问题。

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


相关帖子 inotify