launchctl 限制 maxfiles 与 sysctl kern.maxfilesperproc

Den*_*isL 4 macos macos-highsierra

我试图了解 MacOS High Sierra 的行为。这是我机器上的输出:

launchctl limit maxfiles
maxfiles 256 无限制

sysctl kern.maxfiles
kern.maxfiles: 12228

sysctl kern.maxfilesperproc
kern.maxfilesperproc: 10240

我的问题是:

  1. MAXFILES 256launchctl限制MAXFILES是每个进程的限制?
  2. 为什么MAXFILES通过“launchctl限制MAXFILES”不同于kern.maxfileskern.maxfilesperproc
  3. 哪个限制(maxfiles 256kern.maxfilesperproc: 10240)适用于用户从应用程序手动启动的应用程序?

Spi*_*iff 5

  1. 是否maxfiles 256来自launchctl limit maxfiles每个进程的限制?

是的。launchctl limit maxfiles打印由 报告的每个进程的软限制和硬限制getrlimit(2),其手册页说:

     资源限制被指定为软限制和硬限制。当一个
     超过了软限制,一个进程可能会收到一个信号(例如,如果
     cpu 时间或文件大小超出),但将允许配置
     继续执行直到达到硬限制(或修改其资源
     限制)。

getrlimit(2)显然是 shell 内置命令ulimit获取其信息的地方。

  1. 为什么launchctl limit maxfiles不同于kern.maxfileskern.maxfilesperproc

launchctl limit maxfiles报告 launchd 对进程施加的每个进程的软限制和硬限制。launchd 显然强加了 256 的软限制和“无限”硬限制,这实际上意味着它仅受kern.maxfilesperproc内核限制,而不是受launchd.

kern.maxfiles是整个系统上总文件描述符的限制;所有进程的所有打开文件的总和加上内核为自己的目的打开的所有文件。

  1. 哪个限制(maxfiles 256kern.maxfilesperproc: 10240)适用于用户从应用程序手动启动的应用程序?

由用户从 GUI 启动应用程序手动启动的应用程序将继承 launchd 强加的 256 软限制和“无限制”硬限制,因此它的硬限制实际上是kern.maxfilesperproc,假设系统上有足够的可用文件描述符,应用程序可以在整个系统命中之前达到极限kern.maxfiles

进程(应用程序)还可以在运行后使用系统调用来调整其软限制。所以 256 的软限制只是启动时的默认值,您的应用程序/进程可能会立即增加自己的软限制。