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

标签 macos sockets tcp configuration 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] ( "Too many open files" when executing gatling on Mac ) 将 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();
}

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

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 中)默认施加的限制。

此限制由 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 )。

关于macos - 在 MacOS 上增加传出 TCP 连接的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55366733/

相关文章:

.net - 如何使用 .NET 计算 EC2 服务器上的 TIME_WAIT 连接数

android - 无法通过 ADB 通过 wifi 连接到 Android - 我需要 root 访问权限吗?

iphone - 添加自定义 UITableViewCell 会使模拟器崩溃

java - 是否有用于 Java 的请求-响应网络 API?

macos - gfortran : fatal error: no input files compilation terminated

sockets - 从 Unix 本地套接字接收错误的地址(抽象命名空间)

javascript - 谣言套接字断开连接 : Connectivity loss was detected as it was too long since the socket received the last PONG message

php - 仅在固定时间执行 PHP 脚本

macos - 在 Mac OS 10.15 上使用 gn 和 ninja 从源构建 Electron 时出错

macos - “BloomRPC” 无法打开,因为无法验证开发者