首页/系统/Linux 内核与性能调优速查/net.ipv4.udp_mem 全局内存三值
网络栈调优98 条

net.ipv4.udp_mem 全局内存三值

UDP 全局内存水位(min/pressure/max,单位页);高吞吐 UDP 服务丢包排查时需结合 sockstat 核对缓冲使用。

什么是 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_defaultsocket 默认未显式设置时的初始接收缓冲
core.rmem_maxsocket 上限setsockopt 能被放大的天花板
UDP 丢包的第一嫌疑通常是应用读取太慢:先用 netstat -su 或 ss 确认接收队列是否长期积压,再考虑是否动内核全局上限。
把这些数值直接按页数乘页大小换算时要注意容器环境的页大小与视图差异,误算容易得出与实际相差数倍的结论。
压测时把 sockstat 的 UDP mem 与业务侧接收队列长度一起采样,就能判断丢包发生在内核缓冲还是应用读取环节,比事后凭经验猜测可靠得多。
应用显式设置 SO_RCVBUF 时同样受 net.core.rmem_max 约束:只调全局 udp_mem 而忽略这项上限,会出现全局总量没满、单个 socket 却怎么都加不上去的情况。

易错点

  • UDP 丢包先看应用读取速率与 socket 缓冲,而不是只加内存上限,加错地方会推迟真正的修复
  • 按页换算字节时注意页大小,容器内视图可能与宿主不同,换算错误会误导容量判断
  • 只调 udp_mem 不管单 socket 的 rmem 相关项,瓶颈可能在单个 socket 而不是全局
  • 把 UDP 丢包归结为网络设备问题前,先确认接收队列与 sockstat 的内存计数是否接近上限

数据来源与参考

  • Linux 内核 Documentation/networking/
  • Linux 内核 Documentation/admin-guide/sysctl/net.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌