我怎么知道我是否没有手表化?


47

我使用消耗inotify手表的应用程序。我已经设定

fs.inotify.max_user_watches=32768

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

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


这个问题再次变得非常相关,因为在18.04中证明,如果用尽了inode手表,则无法解锁屏幕。
卡巴斯德

Answers:


64

您怎么知道您是否手表不足?尾巴会告诉!

  • 从任何旧文件tail-f(跟随)选项开始,例如tail -f /var/log/dmesg
    • 如果一切顺利,它将显示最后10行并暂停。使用Ctrl-C中止
    • 如果您精疲力竭,它将失败,并显示以下隐秘错误
      尾巴:无法观看'/ 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位)[来源:12 ]
  • 这是从内核内存中出来的,它是不可交换的。
  • 因此,假设您将最大值设置为524288,并且全部使用(不可能),那么您将使用大约。256MB / 512MB 32位/ 64位内核内存

    • 请注意,您的应用程序还将使用额外的内存来跟踪inotify句柄,文件/目录路径等。多少取决于其设计。
  • 最大值是多少?从理论上讲,只要您有足够的RAM,我就猜不到。实际上,应用程序已正式推荐 524288 ,人们已经将其设置为200万,当然还附带了内存使用情况。


5
如果您还想知道实际的有声手表的数量(因此要多选择是/否),请寻求sudo lsof | grep -i inotify | wc -l
Frank Nocke

2
“编写良好的应用”链接断开。
Gaurav Sharma '18

11

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

检查用户是否达到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监视是40字节inotify设备是68字节inotify事件是272字节

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

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

因此,在所有打开和已满的情况下,很少使用大约3 MB的内存。

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

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

我当然认为自从撰写本文以来,事情并没有太大变化,但是查看我不担心的数字,增加限制不会显着增加RAM消耗。


关于的相关文章 inotify


抱歉,昨天我的草稿开放了几个小时,在我发布我的草案之前没有看到您的答复。我想这是可以的,因为它们有两种不同的方法:-)您能否澄清一下,在最近的内核中,inotify每块手表使用0.5KB(32位)或1KB(64位)内核内存,因为来自2005似乎不再是对的?
ish 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.