为什么 Ubuntu Server 上的 UDP 比 TCP 慢?

为什么 Ubuntu Server 上的 UDP 比 TCP 慢?

我通过 1Gb LAN 上的 iperf 在两个 Ubuntu 服务器(12.04)之间传输数据。

iperf -s    <->     iperf -c <addr> -n2G
TCP speed = 925 Mbits/sec

iperf -su   <->     iperf -uc<addr> -b1G -n2G
UDP speed = 810 Mbits/sec
Jitter = 0.016 ms
Lost = 0 .. 0.01%

我预计 UDP 比 TCP 快得多。有人能解释一下为什么 Ubuntu Server 上的 UDP 比 TCP 慢吗?

答案1

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

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

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

答案2

如上所述,iperf 在设计上有所限制。在src/Client.cpp、方法

void Client::Run( void )

调用

ReportPacket( mSettings->reporthdr, reportstruct );

写入每个 UDP 数据报之后。

ReportPacket()相当慢,并且会使整个过程变慢。

在 iperf3 中,为 UDP 引入了突发写入,您可以在-b命令行参数中指定突发写入的次数,例如-b 10240M/2000

否则,您可以将 netperf 与 一起使用-t UDP_STREAM

答案3

问题出在 iperf 本身。当您发送 UDP 流时,iperf 将对流中的每个数据报进行一些内部记录。另一方面,当您发送 TCP 流时,iperf 只会对每个流进行一次记录。在我的测量中,发现 iperf-UDP 浪费了大量时间进行每个数据报的测量,因此性能较慢。

如果您真的想比较 TCP 和 UDP 的性能,最好编写自己的测试程序,并确保两种情况下的计算量相同。

相关内容