iperf TCP 比 UDP 快得多,为什么?

iperf TCP much faster than UDP, why?

我想知道为什么 iperf 在 TCP 中的性能比 UDP 好得多。这个问题和this一个非常相似。

UDP 应该比 TCP 快得多,因为没有确认和拥塞检测。我正在寻找一个解释。

UDP (807MBits/sec)

$ iperf -u -c 127.0.0.1 -b10G
------------------------------------------------------------
Client connecting to 127.0.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 127.0.0.1 port 52064 connected with 127.0.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   962 MBytes   807 Mbits/sec
[  3] Sent 686377 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   960 MBytes   805 Mbits/sec   0.004 ms 1662/686376 (0.24%)
[  3]  0.0-10.0 sec  1 datagrams received out-of-order

TCP (26.7 Gbits/sec)

$ iperf -c 127.0.0.1
------------------------------------------------------------
Client connecting to 127.0.0.1, TCP port 5001
TCP window size: 2.50 MByte (default)
------------------------------------------------------------
[  3] local 127.0.0.1 port 60712 connected with 127.0.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  31.1 GBytes  26.7 Gbits/sec

我怀疑您使用的是旧版 iperf 2.0.5,它存在已知的 UDP 性能问题。我建议使用 2.0.10 版本。

iperf -v 会给出版本

注意 1:2.0.5 中与此问题相关的主要问题是由于客户端线程和报告线程之间的互斥锁争用。增加了这两个线程之间的共享内存以解决该问题。

注 3:2.0.10 中还有其他与性能相关的增强功能。

鲍勃

UDP should be much faster than TCP because there are no acknowledge and congestion detection.

这主要取决于您要做什么。如果你需要在互联网的两个端点之间传输文件,除非你在应用层手动在UDP上实现可靠的传输机制,否则你会想要使用TCP。

在我看来,使用 iPerf 进行纯 UDP 带宽测试没有多大意义,因为它本质上只会导致 iPerf 尝试尽快将数据包放到线路上。我建议使用它来生成具有恒定数据速率的 UDP 流,以便粗略测量网络中 UDP 流量(例如 VoIP)会发生什么情况。

UDP 数据报的默认长度为 1470 字节。您可能需要使用 -l 参数增加长度。对于 26Gb/s,我会为你的 -l 参数尝试类似 50000 的值,然后从那里上升或下降

您可能还需要在“-b10G”之间添加一个 space,以便它知道 10G 是用于 -b 参数的值。另外我相信大写字母 G 表示 GigaBYTES。 TCP 测试可达到的最大带宽为 26 GigaBITS,与 10GB 相去甚远。我会让你的 -b 参数值为 26g,g 小写。

TCP 在各种硬件卸载方面得到帮助,例如 tso/gro,而 UDP 在任何这些卸载方面都没有帮助,因为它们不适用于 udp 数据报。