使用Linux的合理数量的inotify手表是什么?

Tim*_*ost 39 linux inotify lsyncd

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

有多少手表会太多?

编辑:大多数情况下,我想知道..你有没有看到一个明显的性能影响,如果是这样,它发生了多少手表?是的,我必须监控/递归(但它是一个最小的自举系统).

axk*_*ibe 24

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

我知道从Lsyncd(也许你想检查出来?)有百万只手表的人.它只吃了一千兆字节的内存.


Dav*_*d Z 23

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

  • @Blub 你想使用`fanotify`,整个文件系统只需要1个“监视”(但需要root)。[fsnoop](https://github.com/jeffwalter/fsnoop) 就是一个例子。 (4认同)
  • 我对这个答案和投票数感到困惑。max_user_instances和max_user_不是监视当前的最大值吗?当然,您可以增加这些值,默认情况下,我的max_user_watches设置为8192 ...另外感谢“您不应该做不好的事情”这类非参数。我的意思是,这个问题是在项目环境中提出的。如果要运行其他计算机,那么看看计算机上的设置完全无关紧要。 (4认同)
  • 为什么我不应该使用 inotify 来观察整个文件系统?你能具体点吗? (3认同)
  • 我想索引一个卷,因此如果文件在任何地方更改,我需要更新我的索引.我确实看过ext4源代码,它并不完全是针对用户插件制作的..只有一个dumpe2fs实用程序可以打印"块",但还不知道如何从那里获取实际的文件路径.仍然..我需要不断地运行该实用程序,至少每秒一次以重新更新索引.不太好,我更喜欢回复一些事件 - 就像inotify一样. (2认同)

eRa*_*cal 9

我的信息:

[foo@caffeine ~]# cat /var/log/lsyncd.status | grep Inotify
Inotify watching 293208 directories

[foo@caffeine ~]# cat /proc/sys/fs/inotify/max_user_watches
1048576
Run Code Online (Sandbox Code Playgroud)

lsyncd使用大约130M的内存.

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

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

  • 我认为你看到lsyncd内存使用而不是inotify ... inotify使用内核空间内存... (5认同)

小智 8

这取决于你有多少内存

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

  • 您知道哪里记录了允许佩戴手表的最大数量吗?如今该限制是否仍为 524,288 块? (13认同)
  • 为什么可以观看的最大文件数是 524188?来源? (2认同)

jjl*_*lin 6

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

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

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

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


Bom*_*mbe 5

可能,100亿数万亿的gazillions太多了.Kernel Korner - Inotify简介提到了"成千上万的手表",所以至少这个数字应该不是问题.