什么是 udp_mem
net.ipv4.udp_mem 用三个数值(min、pressure、max,单位是内存页)约束全部 UDP socket 可占用的接收与发送缓冲总量:低于 min 不受限,达到 pressure 开始施加压力,触及 max 则进一步收紧迫使回收。UDP 没有拥塞控制,发送方一旦超过接收端处理速度,数据就在缓冲区里堆积直到被丢弃,因此调参前要先确认丢包发生在哪一侧。
基本信息
| 参数路径 | net.ipv4.udp_mem |
|---|---|
| 单位 | 内存页(通常 4KiB) |
| 三值含义 | min / pressure / max |
| 单 socket 相关 | net.core.rmem_default、rmem_max、udp_rmem_min |
| 观测 | cat /proc/net/sockstat 中 UDP 的 inuse 与 mem |
| 适用 | 高吞吐 UDP 服务:DNS、音视频、QUIC、监控采集 |
典型使用场景
- UDP 服务大量丢包:确认是否撞到全局内存上限
- DNS 与监控采集:短包高频场景下核对缓冲水位
- 音视频与实时传输:评估抖动缓冲与内核缓冲的分工
- 压测期间观察 sockstat 的 mem 数值增长趋势
- 容器与宿主对照:确认限制到底由哪一层生效
查看与核对
查看与核对
sysctl net.ipv4.udp_mem # 三个数值(页)
sysctl net.core.rmem_default net.core.rmem_max
cat /proc/net/sockstat | grep -i udp # inuse 与 mem 水位
ss -uanp | head -10 # 谁在收发 UDP
nstat -az 2>/dev/null | grep -iE 'udp.*(error|drop)' | head
# 换算示例:max=262144 页 × 4KiB ≈ 1GiB
# 调整需评估(示例):sysctl -w net.ipv4.udp_mem='65536 131072 262144'相关参数分工
| 参数 | 层级 | 作用 |
|---|---|---|
| udp_mem | 协议全局 | 全部 UDP socket 缓冲总上限 |
| udp_rmem_min | 单 socket 下限 | 保证小流量 socket 的基本缓冲 |
| core.rmem_default | socket 默认 | 未显式设置时的初始接收缓冲 |
| core.rmem_max | socket 上限 | setsockopt 能被放大的天花板 |
UDP 丢包的第一嫌疑通常是应用读取太慢:先用 netstat -su 或 ss 确认接收队列是否长期积压,再考虑是否动内核全局上限。
把这些数值直接按页数乘页大小换算时要注意容器环境的页大小与视图差异,误算容易得出与实际相差数倍的结论。
压测时把 sockstat 的 UDP mem 与业务侧接收队列长度一起采样,就能判断丢包发生在内核缓冲还是应用读取环节,比事后凭经验猜测可靠得多。
应用显式设置 SO_RCVBUF 时同样受 net.core.rmem_max 约束:只调全局 udp_mem 而忽略这项上限,会出现全局总量没满、单个 socket 却怎么都加不上去的情况。