增加 MacOS 上传出 TCP 连接的限制
Increasing limit of outgoing TCP connections on MacOS
问题的简短版本是:如何 tune\configure macOS (Mojave 10.14.3) 设置允许每个进程超过 10k 的传出 TCP 连接和超过 16k 的连接总共
详情:
我正在尝试使 MacBookPro(16Gb RAM,Core i7)可用于压力测试 tcp 服务器。服务器本身 os 在单独的 PC 上运行,因此现在的问题仅与传出连接有关。
以下建议已经处理并帮助我显着提高初始 os 限制。
1) 我使用 [launchctl] ("Too many open files" when executing gatling on Mac) 将最大文件限制增加到 100 万。
2) 我使用了 sysctl 到 set\check kern.maxfiles 的限制。实际上(据我了解)这与#1 相同。
3) 我玩了 ulimit。实际上,我没有注意到此工具对我的 OS 有任何影响。但无论如何...
所以现在我的 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) 在第一个终端执行 window:
$ 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) 验证第二个终端 window 中应用的所有更改(与 #4 相同)。
7) 在第一个终端中启动 "test client"。
8) 在第二个终端中启动 "test client"。
结果:
在我看到的第一个终端中的第 7 步之后,该工具打开了 10k 个连接(准确地说是 10202 个)并因异常 "Too many open files in system" 而失败。不知道为什么打开的文件是 100 万个限制的问题。
在第二个终端中的第 8 步之后,我可以看到该工具打开了 6k 连接并因异常 "Can't assign requested address" 而倒下。
当套接字保持打开状态(工具等待按键)时,无法在系统中创建其他连接 - 浏览器无法与 google.com 等建立连接
当然,TCP 服务器仍然可以从其他 PC 访问。
因为我可以调整 "Windows 10 Home" 以获得更高的连接数,我相信 MacOS 也可以调整。
16383 个 TCP 连接(从同一 IP 到同一端口)是 MacOs(至少在 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)。
问题的简短版本是:如何 tune\configure macOS (Mojave 10.14.3) 设置允许每个进程超过 10k 的传出 TCP 连接和超过 16k 的连接总共
详情:
我正在尝试使 MacBookPro(16Gb RAM,Core i7)可用于压力测试 tcp 服务器。服务器本身 os 在单独的 PC 上运行,因此现在的问题仅与传出连接有关。
以下建议已经处理并帮助我显着提高初始 os 限制。
1) 我使用 [launchctl] ("Too many open files" when executing gatling on Mac) 将最大文件限制增加到 100 万。
2) 我使用了 sysctl 到 set\check kern.maxfiles 的限制。实际上(据我了解)这与#1 相同。
3) 我玩了 ulimit。实际上,我没有注意到此工具对我的 OS 有任何影响。但无论如何...
所以现在我的 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) 在第一个终端执行 window:
$ 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) 验证第二个终端 window 中应用的所有更改(与 #4 相同)。
7) 在第一个终端中启动 "test client"。
8) 在第二个终端中启动 "test client"。
结果:
在我看到的第一个终端中的第 7 步之后,该工具打开了 10k 个连接(准确地说是 10202 个)并因异常 "Too many open files in system" 而失败。不知道为什么打开的文件是 100 万个限制的问题。
在第二个终端中的第 8 步之后,我可以看到该工具打开了 6k 连接并因异常 "Can't assign requested address" 而倒下。
当套接字保持打开状态(工具等待按键)时,无法在系统中创建其他连接 - 浏览器无法与 google.com 等建立连接
当然,TCP 服务器仍然可以从其他 PC 访问。
因为我可以调整 "Windows 10 Home" 以获得更高的连接数,我相信 MacOS 也可以调整。
16383 个 TCP 连接(从同一 IP 到同一端口)是 MacOs(至少在 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)。