首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么上的UDP比TCP慢?

问为什么上的UDP比TCP慢?
EN

Server Fault用户
提问于 2012-09-26 09:27:21
回答 3查看 20K关注 0票数 4

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

代码语言:javascript
复制
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慢?

EN

回答 3

Server Fault用户

回答已采纳

发布于 2012-09-26 11:13:09

每个帧在发送时都要经过几个缓冲区:应用程序缓冲区、协议缓冲区、软件接口缓冲区和硬件接口缓冲区。当您通过发送高速数据开始强调堆栈时,您将填充这些缓冲区并阻塞或丢失数据。您也有可能影响性能的及时性和轮询策略。例如,通过使用更大的缓冲区和减少轮询次数,您可以在牺牲延迟的同时获得更好的性能。

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

请注意,在UDP上发送高速数据通常是个坏主意,除非您实现了自己的拥塞控制。TCP保护您的网络不受拥塞崩溃。当您有少量数据或高及时性要求时,请使用UDP。

票数 12
EN

Server Fault用户

发布于 2014-01-15 09:09:54

正如上面所说,iperf通过设计来限制自己。在src/Client.cpp,方法

代码语言:javascript
复制
void Client::Run( void )

呼叫

代码语言:javascript
复制
ReportPacket( mSettings->reporthdr, reportstruct );

在编写了每个UDP数据报之后。

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

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

否则,您可以在-t UDP_STREAM中使用netperf。

票数 10
EN

Server Fault用户

发布于 2012-12-04 14:56:12

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

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

票数 8
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/432101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档