我想知道为什么iperf在TCP中表现出比UDP更好的性能。这个问题与这个问题非常相似。
UDP 应该比 TCP 快得多,因为没有确认和拥塞检测。我正在寻找一个解释。
UDP(807 MBits/秒)
$ 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 千兆位/秒)
$ 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
UDP 数据报的默认长度为 1470 字节。您可能需要使用 -l 参数增加长度。对于 26Gb/s,我会为您的 -l 参数尝试类似 50000 的东西,然后从那里上升或下降
您可能还需要在"-b10G"之间添加一个空格,以便它知道 10G 是用于 -b 参数的值。我也相信大写的G意味着千兆字节。通过TCP测试,您可实现的最大带宽为26千兆位,不接近10GB。我会让你的 -b 参数值为 26g,小写 g。
我怀疑您使用的是旧的iperf版本2.0.5,该版本具有UDP已知的性能问题。 我建议使用 2.0.10 版本。
iperf -v 将给出版本
注意 1:2.0.5 中与此问题相关的主要问题是由于客户端线程和报告器线程之间的互斥锁争用。 这两个线程之间的共享内存已增加以解决此问题。
注 3:2.0.10 中还有其他与性能相关的增强功能。
鲍勃
UDP 应该比 TCP 快得多,因为没有确认和拥塞检测。
这主要取决于您要做什么。如果需要在 Internet 中的两个端点之间传输文件,除非在应用程序级别手动实现 UDP 上的可靠传输机制,否则需要使用 TCP。
在我看来,使用 iPerf 进行纯 UDP 带宽测试没有多大意义,因为本质上它只会导致 iPerf 试图尽快将数据包放到网络上。我建议使用它来生成具有恒定数据速率的UDP流,以便粗略测量网络中UDP流量(例如VoIP)会发生什么。
TCP可以帮助各种硬件卸载,例如tso/gro,其中UDP不受任何这些卸载的帮助,因为它们不适用于udp数据报。