测量覆盖networking性能的正确方法

我目前正在研究不同的Docker覆盖networking的性能(特别是UDP吞吐量)。 我通过在与Docker覆盖networking连接的两个主机之间创build点对点连接,然后在Docker容器内运行iperf来检查吞吐量来做到这一点。 我注意到,每次我运行iperf作为客户端发送数据到运行iperf作为服务器的其他容器,客户端主机的CPU使用率达到100%。 我通过运行下面的命令得到了这个结果:

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

所以,对我来说,吞吐量testing的限制因素似乎是我的主机的CPU容量,因为它运行在100%,不能产生更多的stream量来饱和networking连接。 我想知道如果这是一个iperf具体问题,所以我想用一个不同的工具运行相同的testing,但不知道哪个替代将是最好的 。 主机正在运行Ubuntu。 例如,我find了qperfuperfnetpipe

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

这是否意味着应用程序(或覆盖networking)的吞吐量仅取决于传输一定数量的数据所需的CPU周期数,以及如何通过networking对其进行压缩(如果这将是瓶颈的话)。

UDP既是CPU又是带宽绑定 。 它发送数据包时不保证发送,发送和接收数据包。

  • 如果发送者CPU太忙,则不会发送该数据包。
  • 如果带宽不能跟上,报文在传输中被丢弃。
  • 如果接收机CPU太忙或没有准备好处理传入的networking数据,则会丢失。
  • 如果应用程序不能快速从操作系统中提取数据包(并处理它们),则会丢失。

一般来说,UDP的性能是没有意义的。 没有什么能阻止你每秒发送1亿个数据包。 这使发送者CPU和networking饱和,而接收者可能没有得到任何东西。

如果你真的想testingUDP,这是一个相当长的话题,值得一书。 对于初学者,您需要监视错误率以及实际发送/接收的数据。

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