目录
写在前面
本文主要就
ulimit
和sysctl kern.maxfiles
如何修改 mac 打开文件数的最大限制,进行了讲解和说明
1 ulimit 命令介绍
- ulimit 是 Linux shell 的内置命令,用于设置或查看进程资源限制,-a 参数表示显示所有资源限制的当前值
- 默认情况下显示的是软限制(可通过 -S 显式指定),若需查看硬限制需使用 -H 参数
1.1 ulimit -a 输出
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 5000
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
1.2 输出参数解释
- 1.core file size
core 文件大小限制(单位:块),unlimited 表示无限制。 - 2.data seg size
进程数据段的最大值(单位:KB),unlimited 表示无限制。 - 3.file size
进程可创建文件的最大大小(单位:块),unlimited 表示无限制。 - 4.open files
单个进程可同时打开的文件数,默认通常为 1024。 - 5.stack size
进程栈的最大大小(单位:KB),默认如 8192。 - 6.cpu time
进程最大 CPU 时间(单位:秒),unlimited 表示无限制。 - 7.max user processes
用户可同时运行的进程数(含线程),如 2047。 - 8.virtual memory
进程可使用的虚拟内存上限(单位:KB),unlimited 表示无限制。
1.3 ulimit 修改文件数限制
1.3.1 查看当前限制
$ ulimit -n
256 # 当前限制为256
1.3.2 修改限制
$ ulimit -n 5000 # 修改为5000
$ ulimit -n # 再次查看
5000 # 已调整为5000
1.4 ulimit 修改注意事项
ulimit
的设置仅对当前 shell 会话有效,退出后失效。- 需永久修改限制,需通过 /etc/security/limits.conf 配置文件或 systemd 服务单元调整。
- 部分参数(如 open files)需 root 权限或 sudo 才能提升至较高值
2 sysctl kern.maxfiles 说明
sysctl kern.maxfiles
是 macOS/BSD 系统中用于查看或设置系统级最大文件描述符数量的内核参数,表示整个系统允许同时打开的文件总数上限kern.maxfilesperproc
是 macOS/BSD 系统内核参数,用于设置 单个进程可同时打开的文件描述符数量上限,该参数与全局限制kern.maxfiles
共同约束系统文件操作能力,确保进程级资源使用不超过系统整体容量- 进程级限制(
kern.maxfilesperproc
)必须≤
全局限制(kern.maxfiles
),若进程尝试打开文件数超过 kern.maxfilesperproc,即使全局限制未达上限,仍会触发错误(如 Too many open files) - 需 root 权限,如临时设置为 5000,永久生效需通过 /etc/sysctl.conf 或 macOS 修改后需通过 launchd 持久化
$ sudo sysctl -w kern.maxfiles=5000
kern.maxfiles: 12288 -> 5000
$ sudo sysctl -w kern.maxfilesperproc=5000
kern.maxfilesperproc: 10240 -> 5000
$ sysctl kern.maxfiles
kern.maxfiles: 5000
$ sysctl kern.maxfilesperproc
kern.maxfilesperproc: 5000
3 对比说明
参数 | 作用范围 | 约束关系 |
---|---|---|
kern.maxfiles | 系统全局文件描述符 | 所有进程总和 ≤ 此值 |
kern.maxfilesperproc | 单个进程文件描述符 | 单个进程 ≤ 此值,且 ≤ kern.maxfiles |
ulimit -n | 用户/进程级限制 | 进程实际限制 ≤ 此值,且 ≤ kern.maxfilesperproc |
4 配置流程(推荐)
4.1 提升全局限制
sudo sysctl -w kern.maxfiles=200000
4.2 提升进程级限制
sudo sysctl -w kern.maxfilesperproc=100000
4.3 调整进程软/硬限制
ulimit -n 100000