【问题标题】:What is a reasonable amount of inotify watches with Linux?Linux 中合理数量的 inotify 监视是多少?
【发布时间】:2010-10-06 20:27:05
【问题描述】:

我正在开发一个守护进程,它通过 inotify 监视文件事件,以便在访问文件时触发各种类型的事件。我读到手表有点贵,因为内核存储了每个被监视文件的完整路径名。

多少手表会太多?

编辑:大多数情况下,我想知道..你有没有看到过明显的性能下降,如果有,发生在多少只手表上?是的,我必须以递归方式监视/(但它是一个最小的引导系统)。

【问题讨论】:

    标签: linux inotify lsyncd


    【解决方案1】:

    AFAIK 内核不存储路径名,而是存储 inode。然而,在 32 位系统上,每个 Watch 有 540 个字节。在 64 位上翻倍。

    我从 Lsyncd(也许你想看看?)那里知道拥有一百万块手表的人。它只吃一千兆字节的内存。

    【讨论】:

      【解决方案2】:

      您可以通过阅读/proc/sys/fs/inotify/max_user_instances(最大 inotify “对象”数)和/proc/sys/fs/inotify/max_user_watches(最大查看文件数)找到系统限制,所以如果超过这些数字,那就太多了 ;-) 最大值手表的数量通常是几万或更多——在我的系统上,262143——这可能比你需要的多,除非你试图观察文件系统中的每个文件,但你不应该那样做.我想说的是,尽量不要使用比你需要的更多的 inotify 手表,除非你注意到性能显着下降,否则不要担心。

      【讨论】:

      • 为什么我不应该使用 inotify 来监视整个文件系统?能具体点吗?
      • @Blub 好吧,您为什么要这样做?除非您正在调试文件系统实现,否则我想不出一个好的用例,如果这就是您正在做的事情,那么挂钩到文件系统代码本身可能会更好。更不用说,inotify 可能没有足够的手表来实际观看具有现代操作系统的文件系统上的所有内容。但我想如果确实如此(即,如果您正在使用减少的文件集),这可能不是最糟糕的事情。只要您的计算机可以处理它,它就不会损坏任何 AFAIK。
      • 我想索引一个卷,因此如果文件在任何地方发生更改,我需要更新我的索引。我确实看过 ext4 源代码,它并不完全是为用户插件制作的。只有一个可以打印“块”的 dumpe2fs 实用程序,但还不知道如何从中获取实际的文件路径。仍然......我需要不断地运行该实用程序,至少每秒一次以重新更新索引。不太好,我更愿意恢复一些事件 - 就像 inotify 一样。
      • @Blub 你想用fanotify 来做这个,整个文件系统只需要1个“watch”(但需要root)。 fsnoop 就是一个例子。
      • 我对这个答案和赞成票的数量有点困惑。 max_user_instances 和 max_user_watches 不是 current 最大值吗?当然你可以增加这些,我的 max_user_watches 默认设置为 8192 ......另外感谢“你不应该做坏事”这种非论点。我的意思是,这个问题是在一个项目的背景下提出的。如果它要运行其他机器,看看你机器上的设置是完全无关的。
      【解决方案3】:

      /proc/sys/fs/inotify/max_user_watches当前每位用户的最大观看次数。

      从历史上看,内核已将其默认为 8192,但鉴于许多 Linux 发行版对其内核构建进行了相当多的定制,这可能并非在每个 Linux 系统上都是如此。最近的内核更改 [1] 根据系统拥有的 RAM 量动态选择 [8192, 1048576] 范围内的默认 max_user_watches 值。 (5.11 是第一个包含此更改的内核版本。)

      AFAICT,root 可以将 max_user_watches 更改为 2147483647 (231-1) 或以下的任何值,只要您确信您有足够的 RAM 来支持该数量的手表。

      [1]https://github.com/torvalds/linux/commit/92890123749bafc317bbfacbe0a62ce08d78efb7

      【讨论】:

      • 谢谢。接受,所以它作为 2021 年的答案浮到了顶部(问题是在年龄上有点上升)。
      【解决方案4】:

      我的信息:

      [foo@caffeine ~]# cat /var/log/lsyncd.status | grep Inotify
      Inotify watching 293208 directories
      
      [foo@caffeine ~]# cat /proc/sys/fs/inotify/max_user_watches
      1048576
      

      lsyncd 使用大约 130M 的内存。

      我使用 lsyncd 使一些目录与灾难恢复服务器保持同步。

      主服务器上没有性能损失/惩罚。

      【讨论】:

      • 我认为您看到的是 lsyncd 内存使用情况,而不是 inotify...inotify 使用内核空间内存...
      【解决方案5】:

      这取决于你有多少内存

      虽然 524288 是可以观看的最大文件数,但如果您处于内存特别受限的环境中,您可能希望降低该数字。每个文件监视占用 540 字节(32 位)或 ~1kB(64 位),因此假设消耗了所有 524288 个监视,导致上限约为 256MB(32 位)或 512MB(64 位) .

      【讨论】:

      • 你知道允许观看的最大数量记录在哪里/今天的限制仍然是 524,288 吗?
      • 为什么可以观看的最大文件数是 524188?来源?
      【解决方案6】:

      1000 亿万亿可能太多了。 Kernel Korner - Intro to inotify 提到了“数千只手表”,所以至少这个数字应该不是问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多