丢包发生在哪
UDP 没有重传,丢包经常发生在接收缓冲:应用读得慢,内核队列满了就直接丢弃,应用侧甚至感觉不到。所以调优的第一步不是调大缓冲,而是先确认到底是谁读得慢。
两个层次要分清
内核层面有默认值与上限两个参数,应用层面还有自己的套接字缓冲设置,且不能超过内核上限;此外还有软中断队列长度这类与突发流量相关的参数。只改其中一层,往往看不到任何效果。
基本信息
| 查看对象 | 内核默认值与上限、接口队列、套接字队列与错误计数 |
|---|---|
| 内核丢包信号 | 接收缓冲溢出计数与报文接收错误计数 |
| 典型场景 | 域名服务、日志接收端、音视频网关 |
| 应用侧限制 | 设置的接收缓冲不能超过内核上限 |
典型使用场景
- 日志接收端丢日志
- 域名服务在高峰时段丢查询
- 音视频网关出现周期性卡顿
- 排查「同一台机器上只有 UDP 服务丢数据」
查看与调整
查看与调整
sysctl net.core.rmem_max net.core.rmem_default # 看上限与默认值
ss -uanp | head # 接收队列持续高位说明应用读得慢
netstat -su | grep -i -E 'receive buffer|error' # 内核侧丢包计数
# 应用侧设置接收缓冲时,取值不能超过内核上限三层参数
| 层次 | 参数类型 | 作用 |
|---|---|---|
| 内核默认 | 默认接收缓冲 | 新连接继承的初始值 |
| 内核上限 | 最大接收缓冲 | 应用可设置的天花板 |
| 应用 | 套接字接收缓冲 | 按业务吞吐与处理速度设置 |
| 软中断队列 | 接口后备队列 | 吸收瞬时突发流量 |
UDP 丢包没有重传,只能靠应用补偿:监控端丢日志可以加本地磁盘缓冲,域名服务丢查询靠客户端重试。
只调大缓冲而不加快应用读取,只是把丢包推迟:队列最终仍会溢出,同时还会把延迟一起抬高。
排查顺序建议从队列积压看起:接收队列长期高位说明处理能力不足,此时任何缓冲调整都只是缓解症状。