Linux一个应用能否发送巨大的udp数据包,mtu默认值548字节,系统内核会自动fragsout分片重组,kvm网卡ufo硬件加速丢包
Linux一个应用能否发送巨大的udp数据包,mtu默认值548字节,系统内核会自动fragsout分片重组,kvm网卡ufo硬件加速丢包Linux一般C语言代码写的程序一个udp数据包默认值为548,但是可以通过修改程序源代码手动去调整发送更大的udp数据包大小,mtu最大建议控制数据包≤1472字节(虽然发送方避免了重组,但是为了接收方为pppoe拨号上网不触发重组则需要改成1464,既然要考虑接收方那更推荐1352来通过mullvad或者的类似软件)
这样可以避免发送udp数据包的时候触发内核处理fragsout分片重组,降低一些cpu使用,但是带来的就是每次发送数据包大小需要控制
还有几个指标是针对接收udp数据包分片重组的
sockstat_frag_sockets:排队中的等待重组数据包
fragsin:通过分片重组的数据包统计
sockstat_frag_mem:碎片占用内存,超过Linux内核限制则会做丢包处理
只要不发送大数据包,不接收大数据包,那么可能是最理想不涉及到分片重组的方案,但是一些特定的场景一次性要传送比较大无法压缩的udp包就无法避免重组,而且没办法控制别人对自身发的数据包,此时会永远触发接收分片重组
一般来说Linux内核内存管理机制要强制控制发送单个包不超过8K,也就是发送方mtu大小1500的情况,控制包内容在7500-ip包20-udp包8=7472字节实际内容,这样只会发生5次分片(tracker返回400peer的时候,包含tracker协议头20字节,总大小为7220,刚好符合内核申请8K页面内存的限制情况)
如果你发送了一个大包,但是fragsout值为0,因为网卡一般会硬件加速,默认情况显示状态为on
ethtool -k eth0 | grep udp-fragmentation-offload
如果你好奇cpu占用情况,可以临时关闭硬件加速,实际上fragsout显示如果数值只有几百的话,资源消耗基本没什么区别,甚至0.1%差距都没有(看完后记得重新打开硬件加速)
ethtool -K eth0 ufo off
特别提示,如果需要发送较大的udp数据包,并且是kvm的vps服务器,那么一定要禁用ufo硬件加速,否则udp数据包会发送不出去到宿主机网卡引起丢包,tcpdump都抓不到包
最好的解决办法当然是把数据包大小改成1352,而不是禁用硬件加速
如果你想丢掉所有接收到fragsin分片重组的udp数据包,可以调整内核参数实现
编辑文件:/etc/sysctl.conf
net.ipv4.ipfrag_low_thresh = 1
net.ipv4.ipfrag_high_thresh = 1
fragsin分片重组缓冲区大小,默认值3145728改成1
然后执行 /sbin/sysctl -p 让参数生效
页:
[1]