我通过1Gb局域网上的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慢?
发布于 2012-09-26 11:13:09
每个帧在发送时都要经过几个缓冲区:应用程序缓冲区、协议缓冲区、软件接口缓冲区和硬件接口缓冲区。当您通过发送高速数据开始强调堆栈时,您将填充这些缓冲区并阻塞或丢失数据。您也有可能影响性能的及时性和轮询策略。例如,通过使用更大的缓冲区和减少轮询次数,您可以在牺牲延迟的同时获得更好的性能。
TCP是为高速批量传输而优化的,而UDP是针对Linux内核中的低延迟进行优化的。这对缓冲区大小以及数据的轮询和传递方式都有影响。此外,还经常将TCP的硬件卸载。与UDP相比,我期望TCP的性能要好得多。
请注意,在UDP上发送高速数据通常是个坏主意,除非您实现了自己的拥塞控制。TCP保护您的网络不受拥塞崩溃。当您有少量数据或高及时性要求时,请使用UDP。
发布于 2014-01-15 09:09:54
正如上面所说,iperf通过设计来限制自己。在src/Client.cpp,方法
void Client::Run( void )呼叫
ReportPacket( mSettings->reporthdr, reportstruct );在编写了每个UDP数据报之后。
ReportPacket()是相当慢的,它减慢了整个过程。
在iperf3中,对UDP引入了突发写入,您可以在-b命令行参数(如-b 10240M/2000 )中指定突发写入数。
否则,您可以在-t UDP_STREAM中使用netperf。
发布于 2012-12-04 14:56:12
问题就在iperf本身。当您发送UDP流时,iperf将对流程中的每个数据报进行一些内部簿记。另一方面,当您发送TCP流时,iperf每流只做一次簿记。在我的测量中,iperf-UDP浪费了大量的时间来进行数据报测量,因此性能更慢。
如果您真的想比较TCP与UDP的性能,最好编写自己的测试程序。并确保计算量在这两种情况下是相同的。
https://serverfault.com/questions/432101
复制相似问题