MacOS上的传出TCP连接限制越来越大

时间:2019-03-26 21:52:57

标签: macos sockets tcp configuration limit

简短版本的问题是:如何调整\配置macOS(Mojave 10.14.3)设置,以允许每个进程多于10k的传出TCP连接,总共多于16k的连接。

详细信息:
我正在尝试使MacBookPro(16Gb RAM,Core i7)可用于压力测试TCP服务器。服务器本身托管在单独的PC上,所以现在的问题仅是关于传出连接。

以下已处理的建议可以帮助我大大提高初始操作系统限制。
1)我使用[launchctl]("Too many open files" when executing gatling on Mac)将maxfiles限制增加到100万。
2)我使用sysctl设置\检查kern.maxfiles限制。实际上(据我了解)与#1相同。
3)我玩过ulimit。实际上,我没有注意到此工具对我的操作系统有任何影响。但是无论如何...

所以现在我的MacOS可以在每个进程中建立约1万个连接,在系统中建立16万个连接。

为简单起见,我的工具只是在无限循环中打开TCP连接并等待。

try
{
  while (true)
  {
    CreateAndConnectSocket(); //add socket to list
    ++connectedSockets;
  }
}
catch(Exception e)
{
  LogWrite("Connected sockets:" + connectedSockets);
  LogWrite(e);
  WaitForAnyKey();
}

然后我按照以下步骤操作。

1)在单独的PC上启动服务器。 2)在Mac上打开两个终端。
3)在第一个终端窗口中执行:

$ sudo launchctl limit maxfiles 1048576 1048600   
$ ulimit -S -n 1048576   

4)确认更改已应用到第一个终端:

$ ulimit -S -n  
1048576  
$ launchctl limit maxfiles  
    maxfiles    1048576        1048600      
$ sysctl kern.maxfilesperproc  
kern.maxfilesperproc: 1048576
$ sysctl kern.maxfiles  
kern.maxfiles: 1048600  

5)在第二个终端中启动“ ulimit -S -n 1048576”(不确定是否完全需要ulimit。)
6)确认所有更改都在第二个终端窗口中应用(与#4相同)。 7)在第一个终端中启动“测试客户端”。
8)在第二个终端中启动“测试客户端”。

结果:
在第一个终端的第7步之后,我看到该工具打开了1万个连接(准确地说是10202个连接),但出现异常“系统中打开的文件太多” 掉线了。不知道为什么打开的文件限制为100万个问题。
在第二个终端的步骤8之后,我可以看到该工具打开了6k个connectoins并掉了下来,但出现异常“无法分配请求的地址”

当套接字保持打开状态(工具等待按键)时,系统中无法创建其他连接-浏览器无法建立与google.com的连接等。

当然,仍然可以从其他PC上访问tcp服务器。

由于我可以调整“ Windows 10 Home”以获得更高的连接数,因此我相信MacOS也可以进行调整。

1 个答案:

答案 0 :(得分:1)

16383 TCP连接(从同一IP到同一端口)是MacO(至少在Mojave中)默认施加的限制。

此限制由ephemeral port范围定义:

$ sudo sysctl net.inet.ip.portrange

net.inet.ip.portrange.lowfirst: 1023
net.inet.ip.portrange.lowlast: 600
net.inet.ip.portrange.first: 49152
net.inet.ip.portrange.last: 65535
net.inet.ip.portrange.hifirst: 49152
net.inet.ip.portrange.hilast: 65535

默认情况下,范围从49152(net.inet.ip.portrange.first)到65535(net.inet.ip.portrange.last)结束。即65535-49152 = 16383

您可以将临时端口范围从32768开始:

sudo sysctl -w net.inet.ip.portrange.first=32768

通过这种方式,您可以将可用的临时端口加倍(65535-32768 = 32767 )。