为什么 Ubuntu 服务器上的 UDP 比 TCP 慢?

Rom*_*098 4 ubuntu performance iperf tcp udp

我通过 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%
Run Code Online (Sandbox Code Playgroud)

我预计 UDP 比 TCP 快得多。谁能解释为什么 UDP 在 Ubuntu Server 上比 TCP 慢?

peh*_*hrs 9

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

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

请注意,除非您实现自己的拥塞控制,否则通过 UDP 发送高速数据通常是一个坏主意。TCP 保护您的网络免于拥塞崩溃。当你有少量数据或高时效性要求时使用UDP。


小智 9

如上所述,iperf 通过设计限制了自己。在src/Client.cpp,方法

void Client::Run( void )
Run Code Online (Sandbox Code Playgroud)

电话

ReportPacket( mSettings->reporthdr, reportstruct );
Run Code Online (Sandbox Code Playgroud)

在写入每个 UDP 数据报之后。

ReportPacket() 相当慢,它减慢了整个过程。

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

否则,您可以将 netperf 与-t UDP_STREAM.


小智 8

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

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