INotify max_user_instances 和 max_user_watches 之间到底有什么区别?

INotify max_user_instances 和 max_user_watches 之间到底有什么区别?

在阅读了互联网上的一些文章后,我对 INotify 之间的区别有点迷失最大用户实例数最大用户手表数

来自 Linux 官方人员:

/proc/sys/fs/inotify/max_user_instances

这指定了每个真实用户 ID 可以创建的 INotify 实例数量的上限。

/proc/sys/fs/inotify/max_user_watches

这指定了每个真实用户 ID 可以创建的监视数量的上限。

这是否意味着它max_user_instances是 INotify 进程的一个实例,它可以监视多个文件系统并且其限制由 指定max_user_watches

如果前者是正确的,那么在实践中它是如何运作的?每个必须监视某些文件系统的进程正在创建 INotify 的用户实例(我认为不是真的,因为它与用户 ID 相关)?

目前,在 Amazon Ec2 实例上部署后,出现如下错误:

 System.IO.IOException: The configured user limit (128) on the number of INotify instances has been reached.

如果我理解正确的话,创建了太多实例,这些实例正在监视文件系统更改?造成这种情况的原因是什么?

答案1

“实例”是单个文件描述符,由inotify_init().单个 inotify 文件描述符可由一个进程使用或由多个进程共享,因此它们是按用户而不是按进程分配的。

“监视”是一个由 inotify 实例观察的单个文件。每块手表都是独一无二的,因此它们也是按用户限量分配的。

如果应用程序创建了太多实例,它要么启动太多进程(并且不在进程之间共享 inotify 文件描述符),要么只是简单的错误 - 例如,它可能会泄漏打开的 inotify 描述符(打开然后忘记它们,而无需关闭)。

还有一种可能性是,应用程序写得不好,使用了多个描述符,而一个描述符就足够了(几乎不需要超过 1 个 inotify 描述符)。

打开的文件描述符可以通过 procfs 列出:

ls -al /proc/<application process number>/fd/

有关描述符的一些额外信息可以在 中看到/proc/<PID>/fdinfo/<descriptor number>

相关内容