我通过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快得多。 任何人都可以请解释为什么UDP在Ubuntu服务器上比TCP慢?
每个帧在发送时会经过多个缓冲区:应用程序缓冲区,协议缓冲区,软件接口缓冲区和硬件接口缓冲区。 当您开始通过发送高速数据来强调堆栈时,您将填充这些缓冲区并阻止或丢失数据。 你也有时间和投票的策略,可以影响你的performance。 例如,通过使用更大的缓冲区并减less查询次数,可以在牺牲延迟的同时获得更好的性能。
TCP针对高速批量传输进行了优化,而UDP针对Linux内核中的低延迟进行了优化。 这对缓冲区大小以及数据如何轮询和移交有影响。 除此之外,您经常需要卸载TCP硬件。 与UDP相比,我认为TCP的性能要好得多。
请注意,通过UDP发送高速数据通常是一个坏主意,除非你实现自己的拥塞控制。 TCP保护您的networking免遭拥挤崩溃。 有less量数据或高时间要求时使用UDP。
如上所述,iperf通过devise来限制自己。 在src/Client.cpp ,方法
void Client::Run( void )
电话
ReportPacket( mSettings->reporthdr, reportstruct );
写完每个UDP数据报后。
ReportPacket()是相当慢,它减慢了整个事情。
在iperf3中,为UDP引入了突发写入,您可以在-b命令行参数中指定突发写入的数量,如-b 10240M/2000
否则,你可以使用netperf和-t UDP_STREAM 。
问题在于iperf本身。 当你发送一个UDPstream时,iperf会为stream中的每个数据报做一些内部的簿记工作。 另一方面,当你发送一个TCPstream时,iperf每个stream只logging一次。 在我的测量结果中,iperf-UDP浪费了大量的时间进行每个数据报测量,因此性能下降。
如果你真的想比较TCP与UDP的性能,最好是编写你自己的testing程序。 并确保两种情况下的计算量相同。