pan*_*ami 24 udp processing-efficiency packet-loss
通过UDP发送大量数据包会占用更多资源(cpu,zlib压缩等).我在这里读到,通过UDP发送一个大约65kBYTE的数据包可能会失败所以我认为发送大量较小的数据包会更频繁地成功,但随后会产生使用更多处理能力的计算开销(或者至少就是我的我假设).问题基本上是这样的; 发送最大成功数据包并将计算量降至最低的最佳方案是什么?是否有特定尺寸可以在大多数时间使用?我使用Erlang作为服务器,使用Enet作为客户端(用c ++编写).也使用Zlib压缩,我向每个客户端发送相同的数据包(广播是我猜的术语).
Dav*_*rra 26
在UDP payload大多数情况下,最大大小不会导致ip碎片化
MTU size of the host handling the PDU (most of the case it will be 1500) -
size of the IP header (20 bytes) -
size of UDP header (8 bytes)
1500 MTU - 20 IP hdr - 8 UDP hdr = 1472 bytes
Run Code Online (Sandbox Code Playgroud)
@EJP讨论了534字节,但我会修复它508.这是FOR SURE不会导致碎片的字节数,因为主机可以设置的最小MTU大小是576并且IP header max size可以是60 bytes (508 = 576 MTU - 60 IP - 8 UDP)
顺便说一下,我会尝试使用1472字节,因为它1500是一个标准足够的值.
如果您正在通过连接,请使用1492而不是1500进行计算PPPoE.
通过UDP发送大量数据包会占用更多资源吗?
是的,绝对会!我刚刚用流媒体应用做了一个实验.该应用程序每秒发送2000帧数据,精确定时.每帧的数据有效载荷为24个字节.我使用UDP和sendto()将这些数据发送到另一个节点上的监听器应用程序.
我发现的很有趣.这种程度的活动让我的CPU瘫痪了!我从大约64%的可用CPU时间到大约5%!这对我的申请来说是灾难性的,所以我不得不解决这个问题.我决定尝试各种变化.
首先,我只是注释掉sendto()调用,看看数据包组件的开销是什么样的.CPU时间大约增加1%.不错.好的......必须是sendto()调用!
然后,我做了一个快速的假冒测试...我每10次迭代只调用一次sendto() API,但是我将数据记录填充到之前长度的10倍,以模拟将一组较小记录组合成的效果较大的,较少发送.结果非常令人满意:7%的CPU命中率,而之前为59%.看起来,至少在我的类似NIX的系统上,发送数据包的操作只是在拨打电话的开销上是昂贵的.
如果有人怀疑测试是否正常工作,我通过Wireshark观察实际的UDP传输验证了所有结果,以确认所有工作正常.
结论:它使用较少的CPU时间来较少发送较大的数据包,然后以较小的数据包形式发送相同数量的数据更频繁.不可否认,我不知道如果UDP开始破坏你过大的UDP数据报会发生什么......我的意思是,我不知道这增加了多少CPU开销.我会试着找出(我想知道自己)并更新这个答案.