根本原因是系统对单进程可打开文件数的硬性限制过低,默认仅256或1024,必须手动调高才能支撑开发与测试需求;需通过ulimit -n查看当前软限制,用launchctl或sysctl同步调整软硬限制及内核参数以彻底解决。

Mac终端中遇到“Too many open files”错误、Node.js项目构建失败、Webpack监听崩溃或压测时线程卡死,根本原因是系统对单进程可打开文件数的硬性限制过低,默认仅256或1024,必须手动调高才能支撑开发与测试需求。
查看当前限制值
打开终端,执行:
ulimit -n
该命令显示当前 shell 会话的软限制(soft limit),即进程实际能使用的最大文件数。若输出为 256 或 1024,已远低于现代前端/后端项目的实际需要。
再执行:
ulimit -Hn
它显示硬限制(hard limit)——软限制不可超过此值。若 ulimit -n 设置失败并提示 “cannot modify limit: Operation not permitted”,说明你试图突破的就是这个硬限制,必须先提升它。
临时提高限制(重启终端即失效)
方法一:仅调高软限制(需硬限制已足够)
ulimit -n 65536
方法二:先提硬限制,再提软限制(推荐,一步到位)
sudo ulimit -Hn 65536 → ulimit -Sn 65536
【注意:sudo ulimit 在较新 macOS 版本(如 Sonoma/Ventura)中可能被禁用,此时该方法会报错】
方法三:绕过 shell 内置限制,用 launchctl 直接设限(兼容性最好)
sudo launchctl limit maxfiles 65536 65536
执行后立即生效,新开一个终端标签页,运行 ulimit -n 验证是否变为 65536。
永久生效配置(重启后仍有效)
第一步:创建 launchd 全局配置文件
sudo nano /Library/LaunchDaemons/limit.maxfiles.plist
第二步:粘贴以下内容(请严格复制,尤其注意 XML 格式与引号为英文字符):
第三步:加载配置并重启 launchd 子系统
sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist → sudo chmod 644 /Library/LaunchDaemons/limit.maxfiles.plist → sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist
【关键前提:必须确保 /Library/LaunchDaemons/ 下无同名冲突文件,否则加载失败且无提示】
第四步:重启 Mac 或注销当前用户重新登录,再运行 ulimit -n 和 launchctl limit 验证结果。
同步调整内核级参数(避免 ulimit 生效但系统仍拒绝)
仅修改 ulimit 不足以彻底解决问题——当进程申请的文件描述符总数逼近系统全局上限时,会触发 kern.maxfiles 限制。必须同步放宽:
执行:
sudo sysctl -w kern.maxfiles=1048600 → sudo sysctl -w kern.maxfilesperproc=1048576
为使该设置永久生效,写入系统配置:
echo 'kern.maxfiles=1048600' | sudo tee -a /etc/sysctl.conf
echo 'kern.maxfilesperproc=1048576' | sudo tee -a /etc/sysctl.conf
完成后重启终端或重启系统,运行 sysctl kern.maxfiles 确认输出值已更新。











