为什么使用netperf的吞吐量不同?

为什么使用netperf的吞吐量不同?

我在 Windows 操作系统上使用 netperf,两台计算机通过交叉电缆连接。第一台 PC 使用 Realtek FE 网络控制器,第二台 PC 使用 Realtek GBE 控制器。

将第一台电脑作为服务器,将第二台电脑作为客户端,我得到如下结果:

Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    10^6bits/sec  

  8192  65536  65536    10.00      95.11  

当我切换第二台 PC 作为服务器,第一台 PC 作为客户端时,我得到如下结果:

Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    10^6bits/sec  

  65536  8192  8192    10.00      50.11   

为什么这两种情况下的吞吐量不同?

答案1

这可能是因为其中一台机器使用的 TCP 窗口调整不当(netperf 显然将其称为 Recv Socket Size)。在打开 TCP 连接的 TCP 三次握手期间,每台主机都会传达其在接收时可以处理的 TCP 窗口大小,因此另一台主机知道在等待 TCP Ack 之前要发送多少数据。

在 100,000,000 bps 的网络速度和预计 RTT(往返时间 == ping 时间)为 1ms 的情况下,8KiB(8,192 字节 = 65,536 位)不足以传输足够的数据。

要计算要使用的合适 TCP 窗口,您需要计算“带宽 * 延迟乘积”(BDP)。从一台机器 ping 另一台机器并记下 ping 时间。在我繁忙的 GigE LAN 上,现在大约是 1ms。我认为对于 GigE 来说这有点高,但让我们继续使用它,因为您的链路的一端只是 100BASE-TX。

每秒 100,000,000 比特 * 0.001 秒 (1ms) RTT = 100,000 比特

100,000 位 / 每字节 8 位 = 12,500 字节

12,500 字节 / 1024 字节每 KibiByte = 12.2KiB

因此,慢速机器上的 TCP 接收窗口至少需要比现在大 50%(12.2 而不是 8 KiB)。

再说一次,如果您使用的是 Windows 8.x 等现代操作系统,则此答案不适用,因为您的主机应该具有自动 TCP 窗口调整功能,因此最初报告的值可能不可信。如果您使用的是 Windows XP 等古老的操作系统,或者由于某种原因禁用或不工作自动 TCP 窗口调整,则此答案适用。

相关内容