我正在尝试了解 MacOS High Sierra 的行为。以下是我的计算机上的输出:
launchctl 限制最大文件数
maxfiles 256 无限制
sysctl kern.maxfiles
kern.max文件数:12228
sysctl kern.maxfilesperproc
kern.maxfilesperproc:10240
我的问题是:
- 是最大文件数 256从launchctl 限制最大文件数每个进程都有限制吗?
- 为什么最大文件数通过“launchctl limit maxfiles”不同于内核最大文件数和每个进程的最大文件数?
- 哪个限制(最大文件数 256或者kern.maxfilesperproc:10240) 是否适用于用户从应用程序手动启动的应用程序?
答案1
- 是
maxfiles 256
来自launchctl limit maxfiles
每个进程的限制吗?
是的。launchctl limit maxfiles
打印每个进程的软限制和硬限制,如所报告的getrlimit(2)
,其手册页显示:
资源限制被指定为软限制和硬限制。当 超过软限制时,进程可能会收到信号(例如,如果 CPU 时间或文件大小超出),但将允许连接 继续执行,直到达到硬限制(或修改其资源 限制)。
getrlimit(2)
显然是 shell 内置命令ulimit
获取其信息的地方。
- 为什么
launchctl limit maxfiles
与kern.maxfiles
和不同kern.maxfilesperproc
?
launchctl limit maxfiles
报告 launchd 对进程施加的每个进程的软限制和硬限制。 launchd 显然施加了 256 的软限制和“无限制”的硬限制,这实际上意味着它仅受kern.maxfilesperproc
内核的限制,而不是launchd
。
kern.maxfiles
是整个系统上文件描述符总数的限制;所有进程打开的所有文件的总和加上内核为自己的目的而打开的所有文件的总和。
- 对于用户从应用程序手动启动的应用程序适用哪项限制(
maxfiles 256
或)?kern.maxfilesperproc: 10240
用户从 GUI 启动应用程序时手动启动的应用程序将继承 launchd 强加的 256 软限制和“无限制”硬限制,因此其硬限制实际上将为kern.maxfilesperproc
,假设系统上有足够的可用文件描述符,应用程序可以在整个系统达到 之前达到其限制kern.maxfiles
。
进程(应用程序)在运行时也可以使用系统调用来调整其软限制。因此,256 的软限制只是启动时的默认值,您的应用程序/进程可能会立即增加其自己的软限制。