在阅读了互联网上的一些文章后,我对理解 INotify max_user_instances和max_user_watches之间的区别有点迷茫。
来自官方 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.
如果我理解正确,创建的实例太多,正在监视文件系统更改?这可能是什么原因?
“实例”是单个文件描述符,由
inotify_init()
. 单个 inotify 文件描述符可以由一个进程使用或由多个进程共享,因此它们是按用户而不是按进程分配的。“watch”是一个单独的文件,由 inotify 实例观察。每只手表都是独一无二的,因此它们也是按用户配给的。
如果一个应用程序创建了太多的实例,它要么启动了太多的进程(并且不在进程之间共享 inotify 文件描述符),要么它只是简单的错误——例如,它可能会泄漏打开的 inotify 描述符(打开然后忘记它们关闭)。
还有一种可能性是,该应用程序写得不好,并且使用多个描述符就足够了(您几乎不需要超过 1 个 inotify 描述符)。
打开文件描述符可以通过 procfs 列出:
关于描述符的一些额外信息可以在
/proc/<PID>/fdinfo/<descriptor number>
.