最近在做DNS的解析时用的发的都是UDP包,在linux环境下发送10万级别个数的包(就是一次性全扔出去的那种)发现丢包率相当之高,后来加大了缓冲区的大小后大大改善了效果。
主要还是用了linux下的sysctl命令,sysctl能够设置和显示在/proc/sys目录中的内核参数.能用sysctl来设置或重新设置连网功能,如IP转发、IP碎片去除及源路由检查等。
sysctl -w net.core.rmem_max = 5000000
sysctl -w net.core.wmem_max = 5000000
sysctl -w net.core.rmem_default = 5000000
sysctl -w net.core.wmem_default = 5000000
可以像这样来加大缓冲区空间,修改的是/proc/sys/net/core目录下的值,因为UDP是无状态的,在程序没有接受时,一直放在缓冲区里,缓冲区不允许溢出,这样多余的就被丢弃了,开大缓冲区会明显改善效果。其他的一些内容可以看下这篇文章 Linux UDP严重丢包问题的解决
然后还发现多台同时发比一台发丢包要严重,大概是因为二进制回退使得发包延迟丢弃了吧。