如何判断我是不是使用了inotify手表?

我使用的是消耗inotify手表的应用程序。 我已经准备好了

fs.inotify.max_user_watches=32768 

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

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

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

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

对于好奇:为什么尾巴是“尾巴”?

  • 实际上, 任何 写得很好的应用程序都应该礼貌地告诉你,因为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句柄,文件/目录路径等 – 多少取决于其设计。
  • 什么是最大值? 理论上,我认为只要你有足够的RAM。 在实践中,524288 已被应用程序正式推荐 ,当然人们已将其设置为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创建新手表没有问题,这里没有问题。

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

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

如果您看到类似的东西,那么您已达到极限并需要增加允许的手表限制。

是否消耗更多内存?

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

– 内存使用情况 –

inotify数据结构重量轻:

inotify watch是40字节inotify设备是68字节inotify事件是272字节

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

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

因此,在一切开放和完整的罕见情况下,使用大约3 MB的内存。

每个inotify watch都会锁定内存中目录/文件的inode,每个文件系统的inode大小不同,但我们假设它是512个bye。

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

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


关于inotify相关post

  • Dropbox错误 – ‘echo 100000 | sudo tee / proc / sys / fs / inotify / max_user_watches’

  • 内核的inotify手表涨停达到