Linux UDP接收缓冲区上限由net.core.rmem_max控制,设太小会导致SO_RCVBUF被静默截断、RcvbufErrors上升及UDP丢包;应调至16MB并用ss -nump验证rb值匹配。

Linux系统UDP接收缓冲区队列实际由 net.core.rmem_max 控制,该值设得太小会导致应用层 setsockopt(SO_RCVBUF) 设置超限部分被内核静默截断,进而触发 netstat -su 中持续上涨的 RcvbufErrors,最终表现为 UDP 包“收不到”却无明显报错。
确认当前系统级 UDP 接收缓冲区上限
运行以下命令查看真实生效的上限值:
sysctl net.core.rmem_max
注意:该值不是单个 socket 的默认值,而是所有新创建 socket(含 UDP)的 SO_RCVBUF 设置不可逾越的硬上限。若输出为 212992(约 208 KB),说明已严重不足——千兆网卡跑 50Mbps 流媒体时,仅按带宽 × RTT(50ms)估算就需至少 312KB 缓冲空间。
临时调大 rmem_max 并验证生效
方法一:直接写入运行时参数(重启失效)
sudo sysctl -w net.core.rmem_max=16777216
这一步将上限设为 16MB,适用于 100Mbps 码流 + 50ms RTT 场景;若实测仍丢包,可尝试 32MB(33554432),但不要盲目堆高——过大会增加端到端延迟,尤其对实时音视频。
方法二:验证是否真正生效
运行 ss -nump | grep udp,检查输出中 skmem 字段的 rb 值,例如 skmem:(r0,rb16777216,t0,tb8388608),其中 rb 后的数字必须与你刚设置的值一致。只看 sysctl 输出不作数,rb 不匹配说明应用未正确创建 socket 或未显式调用 setsockopt。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
永久固化配置避免重启丢失
第一步:编辑系统配置文件
sudo nano /etc/sysctl.conf
第二步:在文件末尾新增两行(发送侧同步调整更稳妥)
net.core.rmem_max = 16777216
net.core.wmem_max = 8388608
第三步:加载新配置
sudo sysctl -p
【必须执行此步,否则配置不会载入内核】 若提示 “net.core.rmem_max is an unknown key”,说明 /etc/sysctl.conf 格式有误(如多了空格或中文符号),请逐字符检查。










