54

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

多少块手表会太多?

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

4

6 回答 6

34

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

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

于 2011-08-17T11:14:08.643 回答
25

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

于 2009-02-11T07:39:25.110 回答
13

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

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

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

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

于 2021-04-20T02:56:22.873 回答
10

我的资料:

[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 使一些目录与灾难恢复服务器保持同步。

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

于 2012-08-10T21:49:02.650 回答
8

这取决于你有多少内存

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

于 2018-03-17T08:00:17.307 回答
4

1000 亿万亿可能太多了。Kernel Korner - inotify 的介绍中提到了“成千上万的手表”,所以至少这个数字应该不是问题。

于 2009-02-11T07:35:37.053 回答