作为一个常年使用Mac进行开发的程序猿,或多或少会接触到一些高并发的任务,动辄就需要电脑来它几千个线程,几万几十万个QPS。

  但是Mac的普通版本并没有为这种行为进行优化,最简单的,你在终端输入ulimit -a,你会看到当前系统能够打开的文件描述符默认只有……256。这根本不够好嘛?!

  但是作为一个Linux使用经验丰富的人,你一定以为它可以通过/etc下的配置修改。可惜Mac不是Linux而是FreeBSD体系,而且它这个配置自成一派,如果不谷歌一番,我还真不知道怎么改呢。

  在最新版的EI Capitan系统,要修改这个值,首先需要关闭csrutil。Mac对csrutil的安全措施很到位,你使用sudo是不能关闭的,首先需要进入recovery mode,也就是重启时按下command+r,进入恢复模式,然后打开终端,输入csrutil disable,然后重启,建立如下两个文件:

/Library/LaunchDaemons/limit.maxfiles.plist

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?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>

/Library/LaunchDaemons/limit.maxproc.plist

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?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>

再重启一次,执行ulimit -a,你就会发现数字都变化了,现在可以安心测试了!

PS:其实你可以先建立文件再进入恢复模式的,这样一次重启就足够了