运行多个Docker虚拟机的服务器如何处理TCP限制?

在真正的负载下,服务器似乎没有足够快地“回收”TCP连接。

我正在考虑使用Docker来处理每秒比API更高的请求数量,通过在一台机器上创build多个节点服务器的实例来使用多台机器。

如果设置了以下sysctl设置,回收似乎会发生得更快,但是对于存在多less个套接字仍然有一个严格的限制:

net.ipv4.ip_local_port_range='1024 65000' net.ipv4.tcp_tw_reuse='1' net.ipv4.tcp_fin_timeout='15 

当运行多个docker实例时,tcp连接上的总上限是否等于“父”机器可以处理的最大tcp连接的数量?

是的,TCP连接总数将被Docker主机限制。

但是,有三个非常不同的限制:

  • 打开的连接总数(无论源/目标IP地址如何),这与文件描述符的最大数目有关,并且可能非常高(即数百万)
  • 给定本地IP地址的出站连接总数上限(每个本地IP地址限制为64K)
  • 由netfilter跟踪的连接总量

TCP端口回收处理第二个限制。 如果你在主机和容器中使用netstat -nt ,你应该能够很容易地检查你是否接近它。 如果是这样的话,你使用的sysctls应该会有很大的帮助。

如果你是集装箱处理外部交通,它不应该受到这个限制; 不过,你可以打第三个。 您可以使用conntrack -S来检查跟踪连接的数量,如有必要,可以通过调整/proc/sys/net/ipv4/netfilter/ip_conntrack_max提高最大连接数。

指出你正在看到哪些症状会让你觉得服务器没有足够快的回收连接是有帮助的。