inotify文件描述符——为什么是每个用户ID限制而不是每个进程限制?

8
在Linux中,进程可以打开的inotify实例数量受每个用户ID最大数量的限制,该限制在/proc/sys/fs/inotify/max_user_instances中指定。
自然的做法是像文件FD一样对每个进程进行限制。由于inotify FD受用户ID限制,因此在许多使用相同用户ID的进程运行的服务器上更容易达到限制。但我猜肯定有原因吧?
由于我需要在我的代码中使用inotify并希望为系统设置正确的限制,所以这是一个编程问题。

2
如果它是每个进程的限制,用户可以轻松地通过一个简单的 fork() 来绕过限制... - Flexo
inotify实例为什么如此昂贵,以至于必须按用户ID进行限制?请注意,我们只谈论inotify FDs,而不是正在添加的inotify watches。 - Manohar
1个回答

14

这样做的原因是为了防止非root用户通过使用inotify观看大量文件来DoS攻击系统。inotify结构需要相当数量的内存来维护(并且无法交换到磁盘),因此需要一些限制,以控制非特权用户可以提交多少内存。

epoll曾经也有类似的限制(max_user_instancesmax_user_watches),不过最终max_user_instances被删除了,max_user_watches则被设置为内存的4%。

对于inotify可能也应该提交类似的补丁,但迄今为止还没有。

文件描述符在每个进程中是有限制的,原因完全不同:当进程启动时,将分配一个文件描述符表,其大小与允许的最大文件描述符数成比例。尽可能保持这个大小较小,可以减少每个进程的内存开销。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接