首页/系统/Linux 内核与性能调优速查/net.ipv4.udp_mem 等 UDP 缓冲参数
sysctl 内核参数72 条

net.ipv4.udp_mem 等 UDP 缓冲参数

UDP 全局内存水位(udp_mem,按页)与单套接字最小缓冲(udp_rmem_min/udp_wmem_min,默认各 4096);UDP 无流控,缓冲不足直接丢包。

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_memUDP 全局内存三个水位,单位是页
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 的增量判断缓冲是否仍是瓶颈
  • 提高上限后观察网卡层丢弃,确认瓶颈是否转移到收包路径
  • 最后才考虑队列长度与软中断预算,避免只改一层反复试错
接收缓冲并非越大越好:更大的缓冲会推迟应用感知拥塞的时机,需要与业务能容忍的延迟上限一起权衡。

易错点

  • udp_mem 按字节写:单位是页,数值差出三个数量级
  • 只调内核参数不管应用缓冲:应用未设置套接字选项时实际缓冲仍偏小
  • 忽略三层丢包统计:网卡、内核队列与套接字层各有计数,只看一层会误判
  • 缓冲调大但应用读得慢:只是把丢弃点向后移动,丢包仍会发生
  • 忘记另一段队列:netdev_max_backlog 与 UDP 缓冲属于不同环节

数据来源与参考

  • Linux 内核 Documentation/networking/ip-sysctl.rst
  • man 7 udp
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌