为什么我的 UDP 这么慢?

为什么我的 UDP 这么慢?

我在两台虚拟机上使用 Iperf,当使用 TCP 时,我发现性能如下:

notroot@ubuntu:~$ iperf -s
------------------------------------------------------------
服务器监听 TCP 端口 5001 TCP 窗口大小:85.3 KByte(默认)
------------------------------------------------------------
[ 4] 本地 192.168.1.29 端口 5001 与 192.168.1.13 端口 52478 连接
[ ID] 间隔传输带宽
[ 4] 0.0-10.0 秒 2.22 GBytes 1.90 Gbits/秒

另一方面,UDP 很糟糕:

notroot@ubuntu:~$ iperf -s -u
------------------------------------------------------------
服务器监听 UDP 端口 5001
接收 1470 字节数据报
UDP 缓冲区大小:208 KB(默认)
------------------------------------------------------------
[ 3] 本地 192.168.1.29 端口 5001 与 192.168.1.13 端口 33775 连接
[ ID] 间隔传输带宽抖动丢失/总数据报
[ 3] 0.0-10.0 秒 1.25 MBytes 1.05 Mbits/秒 0.284 毫秒 0/ 893 (0%)

我在读本文

问题:

  1. 你觉得结果如何?
  2. 如果是碎片问题,我该如何控制数据报大小?尽管如此,我可以确认 Iperf 客户端正在发送 1470 字节的数据报。

谢谢。

答案1

在这种情况下,问题是 iperf 的默认 UDP 速度非常慢(请参阅其他答案)。但如果速度差异不是很大,请查看此问题服务器故障

引用自pehrs 的回答

发送时,每个帧都会经过多个缓冲区:应用程序缓冲区、协议缓冲区、软件接口缓冲区和硬件接口缓冲区。当您开始通过发送高速数据给堆栈施加压力时,这些缓冲区就会被填满,从而导致数据阻塞或丢失。您还可以制定时效性和轮询策略,这些策略可能会影响您的性能。例如,通过使用更大的缓冲区并减少轮询频率,您可以获得更好的性能,同时牺牲延迟。

TCP 针对高速批量传输进行了优化,而 UDP 针对 Linux 内核中的低延迟进行了优化。这会影响缓冲区大小以及数据的轮询和移交方式。除此之外,您经常需要将 TCP 的负载转移到硬件上。我认为 TCP 的性能会比 UDP 好得多。

请注意,通过 UDP 发送高速数据通常不是一个好主意,除非您实施自己的拥塞控制。TCP 可保护您的网络免受拥塞崩溃的影响。当您的数据量较少或对时效性要求较高时,请使用 UDP。

答案2

iPerf 默认使用 1Mb/秒的 UDP 测试速度。使用-biperf 客户端上的标志指定要传输的 UDP 带宽,例如

iperf -c 10.79.175.219 -u -f m -b 100M

答案3

正如尼克回答的那样,iPerf 对 UDP 默认使用 1Mbit/秒

为了在执行 UDP 测试时使用与 TCP 相同的带宽,只需提供-b具有 值的标志0

iperf3 --udp -b 0 -f m -c <server ip>

形成文档,

-b, --带宽 #[KMG][/#]
目标带宽(比特/秒)

(0 为无限制)

(UDP 默认为 1 Mbit/秒,TCP 不限)

(突发模式的可选斜线和数据包计数)

-f在上面的命令中提供格式类型(m如果是 MBits),

-f, --format [kmgKMG] 报告格式:Kbits、Mbits、KBytes、MBytes

相关内容