解决 MacOS 'Too Many Open Files' 错误

在 MacOS 系统中,当你运行大型应用或开发项目时,可能会遇到 “Too many open files” 错误。这是因为系统默认限制了同时打开的文件描述符数量。本文将介绍如何永久修改这个限制。

问题背景

MacOS 默认的文件描述符限制相对较低,在以下场景中容易触发此限制:

  • 运行大型开发项目(如 Node.js 应用)
  • 使用数据库服务
  • 运行容器化应用
  • 处理大量并发连接

解决方案

1. 创建配置文件

首先,创建一个新的系统配置文件:

sudo vim /Library/LaunchDaemons/limit.maxfiles.plist

2. 配置文件内容

将以下内容复制到配置文件中:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxfiles</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>64000</string>
<string>524288</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>

这个配置将软限制设置为 64000,硬限制设置为 524288。

3. 设置文件权限

配置正确的文件权限和所有权:

sudo chmod 644 /Library/LaunchDaemons/limit.maxfiles.plist
sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist

4. 加载配置

sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist

5. 验证设置

检查新的限制是否生效:

launchctl limit maxfiles

故障排除

如果遇到加载配置失败的情况,可以尝试以下步骤:

  1. 先卸载现有配置:
sudo launchctl bootout system /Library/LaunchDaemons/limit.maxfiles.plist
  1. 重新启用服务:
sudo launchctl enable system/limit.maxfiles
  1. 检查当前用户的文件限制:
ulimit -n

注意事项

  • 修改系统限制需要管理员权限
  • 建议在修改后重启系统以确保设置完全生效
  • 设置过大的限制可能会影响系统性能,建议根据实际需求调整
  • 这些更改是系统级的,会影响所有用户和应用