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

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

我目前正在检查不同 Docker 覆盖网络的性能(尤其是 UDP 吞吐量)。我通过在两个连接到 Docker 覆盖网络的主机之间创建点对点连接,然后iperf在 Docker 容器内运行以检查吞吐量来实现这一点。我注意到,每次我iperf作为客户端运行时,都会将数据发送到运行的另一个容器iperf,客户端主机的 CPU 使用率都会达到 100%。我通过运行我在这里

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

因此,在我看来,我的吞吐量测试的限制因素是主机的 CPU 容量,因为它以 100% 的速度运行,无法生成更多流量来饱和网络连接。我想知道这是否是一个iperf特定问题,所以我想用不同的工具运行相同的测试,但不确定哪种选择最好。主机运行的是 Ubuntu。例如,我发现了qperfuperfnetpipe

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

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

答案1

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

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

一般来说,UDP 性能毫无意义。没有什么可以阻止您尝试每秒发送 10 亿个数据包。这会使发送方 CPU 和网络饱和,而接收方可能什么也得不到。

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

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

相关内容