简短版本的问题是:如何调整\配置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也可以进行调整。
答案 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 )。