在MacOS上增加出站TCP连接数限制

6

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

详情:
我正在尝试使MacBookPro(16Gb RAM,Core i7)可用于压力测试tcp服务器。服务器本身托管在单独的计算机上,因此现在的问题仅涉及传出连接。

以下建议已经被处理并帮助我显著增加了初始操作系统限制。
1) 我使用 [launchctl] ("在Mac上执行gatling时出现Too many open files") 将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)在另一台电脑上启动服务器。 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),并因异常“系统中文件过多”而崩溃。不知道为什么在1百万限制下打开文件会有问题。
在第二个终端中执行第8步后,我可以看到该工具打开了6k个连接,并因异常“无法分配请求的地址”而崩溃。

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

当然,TCP服务器仍然可以从其他计算机访问。

由于我能够将“Windows 10 Home”调整为更高的连接数,因此我相信 MacOS 也可以进行调整。


1
不行,我放弃了。在我的实验中,我意识到Mac桌面上的网络子系统在高负载下存在可靠性问题。因此,这些额外的数千个连接有可能无法按预期工作。所以我决定不浪费时间了。 - Pavlo K
1个回答

8

默认情况下,在MacOs(至少在Mojave中)限制了从同一IP到同一端口的16383个TCP连接。

这个限制是由临时端口范围定义的:

$ 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)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接