增加 MacOS 上传出 TCP 连接的限制



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

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

以下建议已经处理并帮助我显着提高了初始操作系统限制。
1)我使用[launchctl](在Mac上执行加特林时"打开的文件太多")将最大文件限制增加到100万。
2)我使用sysctl来设置\检查kern.maxfiles限制。实际上(据我了解)这与#1相同。
3)我玩过ulimit。实际上我没有注意到此工具对我的操作系统有任何影响。但无论如何...

所以现在我MacOS可以为每个进程建立~10k连接,并在系统中建立16k的总连接。

为简单起见,我的工具只是在无限循环中打开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 之后,该工具打开了 10k 连接(准确地说是 10202)并出现故障,但"系统中打开的文件太多">除外。 不知道为什么打开的文件是 100 万限制的问题。
在第二个终端的步骤 8 之后,我可以看到该工具打开了 6k 连接并出现故障,出现异常"无法分配请求的地址"。

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

当然,tcp 服务器仍然可以从另一台 PC 访问。

由于我能够调整"Windows 10 Home"以获得更高的连接号码,我相信MacOS也可以调整。

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

此限制由临时端口范围定义:

$ 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)就会加倍。

最新更新