测量覆盖网络性能的正确方法

arn*_*e.z 7 iperf linux-networking cpu-usage stress-testing docker

我目前正在检查不同 Docker 覆盖网络的性能(尤其是 UDP 吞吐量)。为此,我在与 Docker 覆盖网络连接的两台主机之间创建点对点连接,然后iperf在 Docker 容器内运行以检查吞吐量。我注意到每次我iperf作为客户端运行向iperf作为服务器运行的另一个容器发送数据时,客户端主机的CPU使用率达到100%。我通过运行在此处找到的以下命令获得了该结果:

top -bn1 | grep "Cpu(s)" | \
       sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
       awk '{print 100 - $1"%"}'
Run Code Online (Sandbox Code Playgroud)

因此,对我而言,吞吐量测试的限制因素似乎是主机的 CPU 容量,因为它以 100% 的速度运行并且无法产生更多流量来使网络连接饱和。我想知道这是否是一个iperf特定问题,所以我想使用不同的工具运行相同的测试,但不确定哪种替代方案最好。主机正在运行 Ubuntu。例如,我发现qperf,uperfnetpipe

此外,更一般地说,我开始想知道吞吐量性能的瓶颈通常是什么。它不总是与CPU容量或链路带宽有关吗?哪些因素与覆盖网络没有直接关系。

这是否意味着应用程序(或覆盖网络)的吞吐量仅取决于它需要多少 CPU 周期来传输一定数量的数据以及它如何压缩它以适应它通过网络(如果这将是瓶颈)。

use*_*461 1

UDP 受 CPU 和带宽限制。它发送数据包,但不保证它们被发送、传输或接收。

  • 如果发送方 CPU 太忙,则永远不会发送数据包。
  • 如果带宽跟不上,数据包就会在传输过程中被丢弃。
  • 如果接收方 CPU 太忙或未准备好处理传入的网络数据,数据就会丢失。
  • 如果应用程序没有足够快地从操作系统中提取数据包(并处理它们),它们就会丢失。

一般来说,UDP性能是没有意义的。没有什么可以阻止您尝试每秒发送无数个数据包。这会使发送方 CPU 和网络饱和,而接收方可能无法获得任何信息。

如果你真的想测试 UDP,那是一个相当长的话题,值得写一本书。首先,您需要监控错误率以及实际发送/接收的数据。

您应该使用 TCP 进行测试以测量主机之间的可用带宽。iperf应该能够做到这一点就好了。