Pav*_*o K 6 sockets macos configuration tcp limit
问题的简短版本是:How to tune\configure macOS (Mojave 10.14.3) settings to allow more than 10k out of TCP connections and more then 16k connection between all each process.
详细信息:
我正在尝试使 MacBookPro(16Gb RAM,Core i7)可用于压力测试 tcp 服务器。服务器本身托管在单独的 pc 上,所以现在的问题仅与传出连接有关。
以下建议已经处理并帮助我显着增加了初始操作系统限制。
1)我使用[launchctl](在Mac上执行gatling时“打开的文件太多”)将maxfiles限制增加到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();
}
Run Code Online (Sandbox Code Playgroud)
然后我按照以下步骤操作。
1) 在单独的 PC 上启动服务器。2)在mac上打开两个终端。
3)在第一个终端窗口中执行:
$ sudo launchctl limit maxfiles 1048576 1048600
$ ulimit -S -n 1048576
Run Code Online (Sandbox Code Playgroud)
4) 验证更改已应用于第一个终端:
$ ulimit -S -n
1048576
$ launchctl limit maxfiles
maxfiles 1048576 1048600
$ sysctl kern.maxfilesperproc
kern.maxfilesperproc: 1048576
$ sysctl kern.maxfiles
kern.maxfiles: 1048600
Run Code Online (Sandbox Code Playgroud)
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 到同一端口)是 MacO 中默认施加的限制(至少在 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
Run Code Online (Sandbox Code Playgroud)
默认情况下,范围从 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
Run Code Online (Sandbox Code Playgroud)
这样,可用的临时端口就增加了一倍 (65535 - 32768 = 32767 )。