今天在模拟一个大量socket连接的时候系统告诉我 socket:Too many open files,之后在查阅怎么修改配置的时候发现了有好几种方式,ulimit, launchctl, sysctl都可以修改文件打开上限,但是在cli下launchctl和sysctl的maxfiles修改都只是改变了参数,cli下的socket连接依然无法创建更多。折腾了将近一下午,终于解决问题,把这些理清楚了!
来自https://serverfault.com/questions/502053/difference-between-ulimit-launchctl-sysctl的回答:
1. ulimit
This is a builtin command of your shell (bash/ash/zsh etc). It temporarily sets process limits for the current shell. This is not OS X specific by the way.
2. sysctl
Most unix-like (Linux/*BSD/OS X) systems set global limit/kernel settings via the
sysctl
command//etc/sysctl.conf
config file. But see below for the OS X caveat.
3. launchd
Seems like OS X does not honor
sysctl.conf
on startup anymore (
https://discussions.apple.com/thread/2781309?start=0&tstart=0). So on OS X, it looks like
sysctl
is merely usable for
temporarily setting the global limits.
翻译:
1、ulimit
这是一种嵌入shell的命令,只能临时设置当前shell(也就是当前进程)的参数。unix-like OS都有。
2、sysctl
大部分unix-like OS都采用这个来设置全局的内核限制,sysctl为命令,/etc/sysctl.conf为配置文件。不过请看下面的launchctl
3、 launchctl
看起来OS X在启动的时候不在尊重sysctl.conf的配置(附链接)。所以在OS X上,sysctl仅仅能够临时设置全局限制。
(第三条看起来和个人使用下来的感觉一样,这两个配置在OS X上有点混乱)
以下是博主使用下来确认的应用级经验:
ulimit:
ulimit仅作用于当前shell,也就是当前进程
ulimit -n 的设置理所当然的也是临时设置
ulimit下的open files才是真正影响当前进程打开文件的配置
修改open files的上限不能超过
kern.maxfilesperproc设置(参见下面sysctl参数)
launchctl:
launchctl为macOS特有配置
$ launchctl limit maxfiles
maxfiles 1024 10240
可将launchctl子命令写入/etc/launchd.conf中
有软配和硬配。软配为每个进程可自由控制,但不能超过硬配;硬配为只有root才能修改,目的就是给软配划定上限。
修改该项配置会直接同时设置sysctl的
kern.maxfilesperproc参数
热修改sysctl上限值不会影响launchctl,而反之,launchctl会影响sysctl上限值
sysctl:
sysctl为系统控制
$ sysctl -a|grep files
kern.maxfiles: 10240
kern.maxfilesperproc: 512
由以上两个配置项决定,第一个为内核总文件上限,第二个为每个进程允许的上限
在/etc/sysctl.conf中写入,
通过配置文件永久更改 重启生效