Linux UDP Socket发送性能调优:除wmem_max外的可配置参数咨询
针对你开发的C语言UDP发送程序,除了wmem_max,以下几个/proc/sys/net/core下的参数可以针对性优化,帮你拿到额外的吞吐量增益:
wmem_default
这是系统默认的Socket写缓冲区大小,如果你的程序没有通过setsockopt(SO_SNDBUF)手动设置缓冲区,内核会用这个值初始化每个UDP Socket的发送缓冲区。既然已经调大了wmem_max,建议同步提升wmem_default(比如设为和wmem_max同级别或适配你的单包大小),避免每次创建Socket都要手动修改缓冲区,减少不必要的系统调用开销。netdev_max_backlog
当网卡暂时无法处理发送请求时,待发送的数据包会存在这个内核队列里。如果你的发送速率远超网卡处理能力,默认的队列长度(通常1000)会很快被占满,导致数据包丢包。调大这个值(比如设为4096或更高),能降低高负载下的发送丢包率,提升整体吞吐量。max_skb_frags
如果你的程序发送大尺寸UDP包(需要分片传输),这个参数控制每个内核缓冲区(skb)能拆分的最大片段数。调大它(比如从默认16改为32/64)可以减少内存拷贝的次数,提升大UDP包的发送效率,不过要注意不要超过系统内存的承载能力。dev_weight_tx_bias
这个参数用于调整内核调度时对发送任务的权重偏向。如果你的系统主要负载是UDP发送,把它从默认0调大(比如设为5),能让内核分配更多CPU资源给发送路径,减少发送延迟,提升高负载下的吞吐量稳定性。default_qdisc
默认的网络队列调度器会直接影响数据包的排队效率。如果当前用的是pfifo_fast这类简单调度器,建议换成fq或fq_codel这类针对高吞吐优化的调度器,能更好地避免队列拥塞,降低数据包的排队延迟,提升发送速率。修改命令:sysctl -w net.core.default_qdisc=fqsomaxconn
虽然它主要针对TCP监听队列,但如果你的UDP程序使用了connect模式、或者需要创建大量并发发送Socket,调大这个值(从默认128改为1024)可以避免内核因资源限制拒绝创建Socket,保障高并发场景下的发送能力。
注意:所有参数调整都需要结合你的硬件配置、网络环境做测试验证,没有通用的“最优值”,建议用iperf或自研测试工具对比调整前后的吞吐量变化,找到最适合你的配置。
内容的提问来源于stack exchange,提问作者Simao

