UDP 缓冲参数
UDP 没有流控与重传,接收缓冲一旦不够就直接丢包。net.ipv4.udp_mem 是 UDP 的全局内存水位,三个数值分别是低水位、压力水位与上限,单位为页;net.ipv4.udp_rmem_min 与 udp_wmem_min 是单个套接字的最小缓冲字节数。单套接字实际缓冲还受应用设置的 SO_RCVBUF、SO_SNDBUF 与 net.core.rmem_max、rmem_default 影响,多层叠加才是最终生效值。
基本信息
| udp_mem | UDP 全局内存三个水位,单位是页 |
|---|---|
| udp_rmem_min 与 udp_wmem_min | 单套接字最小缓冲字节数 |
| 应用层 | SO_RCVBUF、SO_SNDBUF 与 net.core.rmem_max 共同决定上限 |
| 观测 | ss -u -m 与 /proc/net/snmp 的 RcvbufErrors |
| 相关队列 | net.core.netdev_max_backlog 是收包路径上的另一段队列 |
典型使用场景
- DNS、syslog 等高吞吐 UDP 服务收到率不足
- 排查 UDP 丢包与缓冲设置的关系
- 容器内 UDP 服务的接收侧调优
- 与 netdev_max_backlog 一起排查收包链路
- 判断应用读取速度是否为真正的瓶颈
查看与调整
查看与调整
sysctl net.ipv4.udp_mem net.ipv4.udp_rmem_min net.ipv4.udp_wmem_min
sysctl net.core.rmem_max net.core.rmem_default
ss -u -m -a | head -20 # UDP 套接字与缓冲占用
cat /proc/net/snmp | grep -A1 Udp # RcvbufErrors 增长说明缓冲不足
sysctl -w net.core.rmem_max=16777216
sysctl -w net.ipv4.udp_rmem_min=8192
ethtool -S ens5 | grep -i drop | head # 网卡侧丢弃统计作为对照参数与单位
| 参数 | 单位 | 作用 |
|---|---|---|
| net.ipv4.udp_mem | 页 | UDP 全局内存的三个水位 |
| net.ipv4.udp_rmem_min | 字节 | 单套接字接收缓冲最小值 |
| net.ipv4.udp_wmem_min | 字节 | 单套接字发送缓冲最小值 |
| net.core.rmem_max | 字节 | 应用可设置的最大接收缓冲 |
| net.core.netdev_max_backlog | 包数 | 网卡到协议栈之间的队列长度 |
UDP 丢包没有重传兜底,监控要区分三层:网卡丢包、内核队列丢包与应用套接字统计,只看一层容易误判。
udp_mem 的三个水位单位是页,按字节写入会差出三个数量级,等于把限制设成几乎为零或形同不限。
调优顺序
- 先确认应用侧套接字缓冲设置,再看内核最小值与全局上限
- 用 RcvbufErrors 的增量判断缓冲是否仍是瓶颈
- 提高上限后观察网卡层丢弃,确认瓶颈是否转移到收包路径
- 最后才考虑队列长度与软中断预算,避免只改一层反复试错
接收缓冲并非越大越好:更大的缓冲会推迟应用感知拥塞的时机,需要与业务能容忍的延迟上限一起权衡。