inotify FD - 为啥限制每个用户 id 而不是每个进程?

Posted

技术标签:

【中文标题】inotify FD - 为啥限制每个用户 id 而不是每个进程?【英文标题】:inotify FD - why is the limit per user id and not per process?inotify FD - 为什么限制每个用户 id 而不是每个进程? 【发布时间】:2012-06-19 22:11:06 【问题描述】:

在 Linux 中,进程可以打开的 inotify 实例数的限制受 /proc/sys/fs/inotify/max_user_instances 中指定的每个用户 ID 最大数的限制

自然会限制每个进程,例如文件 FD。由于 inotify FD 受用户 ID 的限制,因此它更有可能在许多进程可能使用相同用户 ID 运行的服务器上达到限制。但我想这一定是有原因的?

这是一个编程问题,因为我必须在我的代码中使用 inotify 并希望为系统设置正确的限制。

【问题讨论】:

如果是每个进程,用户可以通过简单的fork() 轻松绕过限制... 什么是 inotify 实例如此昂贵以至于必须限制每个用户 id ?请注意,我们只是在讨论 inotify FD,而不是正在添加的 inotify 监视。 【参考方案1】:

原因是为了防止非root用户通过使用inotify查看大量文件来DoSing系统。 inotify 结构需要不可忽略的内存量来维护(并且不能换出到磁盘),因此需要对非特权可以提交的数量进行一些限制。

epoll 曾经有类似的限制(max_user_instancesmax_user_watches),尽管最后 max_user_instances 被删除,max_user_watches 被设置为内存的 4%。

应该为 inotify 提交一个类似的补丁,但到目前为止还没有。

文件描述符在每个进程的基础上受到完全不同的限制:当一个进程启动时,分配一个文件描述符表,其大小与允许的最大文件描述符数成正比。保持这个尽可能小可以减少每个进程的内存开销。

【讨论】:

以上是关于inotify FD - 为啥限制每个用户 id 而不是每个进程?的主要内容,如果未能解决你的问题,请参考以下文章

如何限制每个用户 ID 一行

为啥inotify会丢失事件?

为啥'id'在keycloak中被称为'sub'?

RubyMine - inotify(7) 监视限制太低

inotify 监控几个脚本

inotify 监控几个脚本