首页/网络/协议速查/UDP 缓冲与丢包调优
TCP 与 UDP54 条

UDP 缓冲与丢包调优

UDP 丢包常发生在接收缓冲:应用读得慢,内核直接丢;调大 SO_RCVBUF 与 net.core.rmem_max 并提升读取速度是正解。

协议速查网络更新于 2026-10-13

丢包发生在哪

UDP 没有重传,丢包经常发生在接收缓冲:应用读得慢,内核队列满了就直接丢弃,应用侧甚至感觉不到。所以调优的第一步不是调大缓冲,而是先确认到底是谁读得慢。

两个层次要分清

内核层面有默认值与上限两个参数,应用层面还有自己的套接字缓冲设置,且不能超过内核上限;此外还有软中断队列长度这类与突发流量相关的参数。只改其中一层,往往看不到任何效果。

基本信息

查看对象内核默认值与上限、接口队列、套接字队列与错误计数
内核丢包信号接收缓冲溢出计数与报文接收错误计数
典型场景域名服务、日志接收端、音视频网关
应用侧限制设置的接收缓冲不能超过内核上限

典型使用场景

  • 日志接收端丢日志
  • 域名服务在高峰时段丢查询
  • 音视频网关出现周期性卡顿
  • 排查「同一台机器上只有 UDP 服务丢数据」

查看与调整

查看与调整
sysctl net.core.rmem_max net.core.rmem_default    # 看上限与默认值
ss -uanp | head                                   # 接收队列持续高位说明应用读得慢
netstat -su | grep -i -E 'receive buffer|error'   # 内核侧丢包计数
# 应用侧设置接收缓冲时,取值不能超过内核上限

三层参数

层次参数类型作用
内核默认默认接收缓冲新连接继承的初始值
内核上限最大接收缓冲应用可设置的天花板
应用套接字接收缓冲按业务吞吐与处理速度设置
软中断队列接口后备队列吸收瞬时突发流量
UDP 丢包没有重传,只能靠应用补偿:监控端丢日志可以加本地磁盘缓冲,域名服务丢查询靠客户端重试。
只调大缓冲而不加快应用读取,只是把丢包推迟:队列最终仍会溢出,同时还会把延迟一起抬高。
排查顺序建议从队列积压看起:接收队列长期高位说明处理能力不足,此时任何缓冲调整都只是缓解症状。

易错点

  • 只调大套接字缓冲但应用不加快读取:丢包只是被推迟,延迟反而更高
  • 应用设置的值超过内核上限:设置被静默截断,误以为已经生效
  • 只看应用日志判断有没有丢包:内核在应用之前就丢了,日志里不会有任何记录
  • 忽略突发流量:软中断队列与接口队列在瞬时高峰时同样会丢
  • 把缓冲调到极大:内存占用上升,还可能掩盖真正的处理瓶颈

数据来源与参考

  • man 7 socket
  • Linux 内核文档(core sysctl)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌