【4.4】MAC too many open files 问题解决

一、原因:

文件句柄数不够,需要调高ulimit 里面的-n 的值。

二、排查

终端输入下面命令

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) 256
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

文件数:

ulimit -n

256

一般默认是256

三、解决

  • 在用户目录下的.bash_profile中的末尾加入ulimit -n 10240
  • 保存后再执行 sudo source ~/.bash_profile 即可

四、可能出现的问题

假如设置的数字特别大,会提示下面的错误

ulimit:124: setrlimit failed: invalid argument

使用下面两个命令看下系统最大数

sysctl kern.maxfiles
sysctl kern.maxfilesperproc

最大连接数限制就是系统所能打开的最大文件数(文件描述符)的限制,分全局和进程两种,相应的命令如下:

  • kern.maxfiles 全局限制,也就是系统默认的最大连接数限制
  • kern.maxfilesperproc 单个进程默认最大连接数限制

假如系统最大数字不满足你的要求,就修改下系统最大数,命令如下(数字自己设定,但是不要太大,有的电脑系统貌似有限定):

sudo sysctl -w kern.maxfiles=65536
sudo sysctl -w kern.maxfilesperproc=65536

然后再设置 ulimit 即可

说明:设置当前shell能打开的最大文件数ulimit为1048576,该值不能大于kern.maxfilesperproc,否则会提示设置失败。

五、我的解决方案

vim /etc/sysctl.conf

kern.maxfilesperproc=65535
kern.maxfiles=100000

vim /Library/LaunchDaemons/limit.maxfiles.plist

<?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>524288</string>
        <string>524288</string>
      </array>
    <key>RunAtLoad</key>
      <true/>
    <key>ServiceIPC</key>
      <false/>
  </dict>
</plist>

vim /Library/LaunchDaemons/limit.maxproc.plist

<?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.maxproc</string>
    <key>ProgramArguments</key>
      <array>
        <string>launchctl</string>
        <string>limit</string>
        <string>maxproc</string>
        <string>2048</string>
        <string>2048</string>
      </array>
    <key>RunAtLoad</key>
      <true/>
    <key>ServiceIPC</key>
      <false/>
  </dict>
</plist>

然后:

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

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

launchctl limit maxfiles
ulimit -n

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn