网络流量
iftop
我们运行包含 3 个管理器节点和 16 个工作节点的 Docker Swarm。三个管理器节点中的两个节点之间的网络 I/O 非常高。为了说明这一点,以下是三个管理器节点的输出:
vm71 (10.0.0.131)
vm71 => 10.0.0.130 39.3Mb 47.5Mb 49.3Mb
<= 802Kb 1.03Mb 1.07Mb
vm70 (10.0.0.130)
vm70 => 10.0.0.131 798Kb 1.00Mb 1.00Mb
<= 40.9Mb 44.8Mb 44.8Mb
vm75 (10.0.0.135)
vm75 => 10.0.0.131 9.50Kb 10.1Kb 9.51Kb
<= 7.83Kb 8.08Kb 7.56Kb
如上所示,vm70 和 vm71 之间的流量大约是 vm75 与其他两个管理器之间流量的 4,000 倍。我们已设置规则,在任何 swarm 管理器上均不运行容器。通过docker stats
在每个管理器上运行,我们确认了这一点。
按流程联网
下一个显而易见的问题是哪些进程正在生成此网络 I/O。 的输出netstat -tup
如下。 我只显示了与相关端口相关的行iftop
。
tcp6 0 46 vm71:2377 10.0.0.130:39316 ESTABLISHED 791/dockerd
请注意,这是 tcp6 流量。
我们很困惑。为什么这些管理器节点之间会出现如此多的流量?如果我们降级然后提升管理器节点,流量会在一段时间内消失。但是,流量最终会再次增加。这可能是什么原因造成的?
答案1
我建议使用 tcpdump 捕获网络请求,您需要一个监控工具/脚本来观察何时执行它。常见的罪魁祸首是内存突然增加相关性,如果主管理器的内存使用量突然大幅增加,这是可以解释的。从您的输出来看,这似乎只是在负载平衡时击中管理器 2 并转移到领导者的请求。