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

时间:2013-11-04 03:44:40

标签: performance sockets tcp docker

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

我正在研究使用Docker通过在一台计算机上创建多个节点服务器实例与使用多台计算机来处理每秒高于平时的API请求数。

如果设置了以下sysctl设置,回收确实似乎发生得更快,但仍然存在一个硬限制,即存在多少个套接字:

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

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

1 个答案:

答案 0 :(得分:5)

是的,TCP连接的总上限将由Docker主机限制。

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

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

TCP端口回收处理第二个限制。如果您在主机和容器中使用netstat -nt,则应该能够轻松检查您是否接近它。如果是这种情况,您使用的sysctl应该会有很多帮助。

如果您的集装箱处理外部流量,则不应受此限制;但是,你可以击中第3名。您可以使用conntrack -S检查跟踪的连接数,如有必要,可通过调整/proc/sys/net/ipv4/netfilter/ip_conntrack_max来提高最大连接数。

指出您所看到的哪些症状会让您认为服务器没有足够快地回收连接会有所帮助?