如何规避极低网络吞吐量从主机到集装箱码头工人?



当从主机向docker容器发送数据时,与从主机向同一主机发送流量相比,我遇到了非常弱的网络性能。

我用iPerf测量了TCP性能,这些是安装了Docker的不同操作系统上的结果:

tbody> <<tr>
操作系统 客户端 服务器 带宽(使用iPerf测量,见下文)
macOS主机主机~ 56.3 gbit/秒
macOS主机容器~ 350兆比特/秒的
Windows Pro 10主机主机~ 5 Gbit/秒
Windows Pro 10主机容器~ 680 Mbit/s

loopback接口的MTU (Maximum Transmission Unit,最大传输单元)往往比较大。例如,"lo0"我的Mac运行12.4的接口是16384字节。您可以比较一下Docker接口的mtu。TCP依赖于大型mtu和/或无状态卸载(ChecKsum Offload/CKO和TCP Segmentation Offload/TSO和large/Generic Receive Offload/[LG]RO),通过最小化达到给定比特率所需的协议栈上下的往返次数来实现高比特率。

例如,如果Docker接口的MTU是1500字节而不是16384字节,并且没有无状态的卸载,那么您可能会期望基于Docker的测试大约需要16384/1500,或者是普通环回协议堆栈上下传输的10倍。在此基础上,它将是一个更长的基本代码路径。如果TSO/GRO是通过环回而不是Docket接口提供的,那么差异会更大。有了这些,TCP就可以表现得好像MTU高达64 KiB。

如果您在iperf批量传输测试之外运行类似netperf TCP_RR测试的东西,您将获得普通环回和Docker配置之间基本数据包路径长度差异的初步近似。

最新更新