为什么我的TCP吞吐量比UDP吞吐量大得多?


15

我没有对硬件或内核配置(所有默认设置,全新的操作系统安装,Linux内核3.11 TCP / IP堆栈)进行任何异常处理,通过TCP我平均每秒平均发送约383万条消息,而我平均仅为0.75每秒通过UDP的百万条消息。这似乎完全违背了我对这两个协议的期望。

造成这种巨大差异的最可能原因是什么,如何在Ubuntu 13.10上进行诊断?

#TCP RESULTS
Recv   Send    Send                          Utilization       Service Demand
Socket Socket  Message  Elapsed              Send     Recv     Send    Recv
Size   Size    Size     Time     Throughput  local    remote   local   remote
bytes  bytes   bytes    secs.    10^6bits/s  % S      % S      us/KB   us/KB

87380  65536     64    10.00      1963.43   32.96    17.09    5.500   2.852

#UDP RESULTS
Socket  Message  Elapsed      Messages                   CPU      Service
Size    Size     Time         Okay Errors   Throughput   Util     Demand
bytes   bytes    secs            #      #   10^6bits/sec % SS     us/KB

4194304      64   10.00     7491010      0      383.5     28.97    24.751
212992            10.00     1404941              71.9     25.03    21.381

对于此测试,我有两个相同的测试服务器,它们直接通过10G交叉电缆连接。在这种情况下使用的NIC是具有开箱即用配置的Intel X520,并连接到主板上的PCIe 3.0 x8插槽,该插槽通过NUMA控制器与CPU通信。


您如何衡量基准?针对您发送的那些包裹?
Braiam 2014年

我使用netperf了基准测试,UDP_STREAM和TCP_STREAM测试(固定到相同的CPU和64字节的消息大小)。
elleciel 2014年

1
那不能回答@Braiam的问题。这里是网络拓扑,详细的测试方法很重要。
PavelŠimerda2014年

1
@PavelŠimerda对不起,我以为他只是在要求测试方法。关于网络拓扑,两个测试服务器是相同的,并通过10G交叉电缆直接连接。在这种情况下使用的NIC是具有开箱即用配置的Intel X520,并连接到主板上的PCIe 3.0 x8插槽,该插槽通过NUMA控制器与CPU通信。这回答了你的问题了吗?
elleciel 2014年

1
是的,@ elleciel,它肯定回答了我的问题。尽管在这种情况下,我没有专业知识为您提供直接连接机器的答案。我看到您修改了问题本身,这很棒。请问问题,因为我现在也很感兴趣。
PavelŠimerda2014年

Answers:


29

除了没有获得有关您的测试设置的详细信息之外,主要问题似乎还在于,您使用的消息大小为64字节。这与通常的1500字节的MTU相距甚远,并且使UDP效率很低:尽管TCP将多个发送合并到网络上的单个数据包(除非设置了TCP_NODELAY)以有效利用链接,但每个UDP消息都会导致一个单独的数据包。以数字表示:大约23条64字节大小的消息将被组合成一个MTU大小的TCP数据包,而对于相同数量的数据,它将需要UDP 23个单个数据包。这些数据包中的每一个都意味着从主机发送,在线传输和对等方接收时的开销。从您的情况可以看出,大约80%的UDP数据包丢失了,因为您的硬件传输和接收所有这些数据包的速度不够快。

因此,您可以从该基准中学到的是:

  • UDP不可靠(80%的数据包丢失)
  • 如果数据包的大小远低于MTU,则UDP效率不高
  • TCP进行了高度优化,以充分利用链接

如您所愿,UDP应该更好:您是否想知道为什么所有主要文件传输(ftp,http,...)都是基于TCP的协议完成的?基准向您显示了原因。

那么,为什么人们完全使用UDP?

  • 使用实时数据(例如IP语音),您无需关心较旧的消息,因此您不希望发件人将消息合并为较大的数据包以有效利用链接。您宁愿接受一个数据包丢失也不愿让它到达太迟。
  • 对于高延迟链接(如卫星),TCP的默认行为并非最佳选择,无法有效利用链接。因此,在这种情况下,有些人切换到UDP并重新实现TCP的可靠性层并针对高延迟链接对其进行优化,而其他人则对现有的TCP堆栈进行调整以更好地利用该链接。
  • “丢弃”数据:有时更重要的是将数据发送出去,而不关心数据包丢失,例如日志消息(syslog)
  • 简短的交互:使用TCP,您需要建立一个连接并维护一个状态,这会花费时间和客户端和服务器上的资源。对于短时间的交互(例如短时间的请求和答复),这可能会导致过多的开销。因此,DNS通常是使用UDP完成的,但已在UDP之上建立了重试功能。

2
您还应该查看UDP造成的80%数据包丢失。看来您的硬件不够快,无法以与发送数据包相同的速度处理数据包。尽管TCP通过减慢速度来适应这种数据包丢失,但UDP只会以相同的速度发送并继续丢失数据包。但是最后,发送的速度与接收的速度无关。
斯特芬·乌尔里希

1
可能会影响因素的其他因素是TCP加速/卸载到网卡(如果支持)。
cpugeniusmv 2014年

1
数据包发送可能比接收数据包更有效,尤其是在最后一个是中断驱动的情况下。
Steffen Ullrich'3

1
人们还对嵌入式设备使用UDP来通过电线广播其正在收集的数据,而不必理会连接设置
棘手的问题2014年

3
您很可能受PCI Express总线的IO约束。网卡最有可能启用了TCP段卸载。这意味着TCP传输将作为一个大块发送到卡,然后将卡切成薄片并将它们切成小包,然后将它们放在网上。UDP没有等效项,因此结果是每个数据包进行一个PCIe事务(以及所有相关的开销)。
alex.forencich 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.