3

在非常重的负载下,服务器似乎没有足够快地“回收” 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 连接数?

4

1 回答 1

5

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

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

  • 打开连接的总上限(不考虑源/目的IP地址),与文件描述符的最大数量有关,可以非常高(即百万)
  • 给定本地 IP 地址的出站连接总数(每个本地 IP 地址限制为 64K)
  • netfilter 跟踪的连接总数

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

如果您的容器正在处理外部流量,则不应受到该限制;但是,您可以击中第三个。您可以使用 来检查跟踪的连接数conntrack -S,如有必要,通过调整 来提高最大连接数/proc/sys/net/ipv4/netfilter/ip_conntrack_max

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

于 2013-11-04T14:24:01.630 回答