在阅读了互联网上的一些文章后,我对 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>
。