net.core.rmem_max改了但应用仍丢包,因接收队列受rmem_max(socket层)和netdev_max_backlog(设备层ingress队列)共同控制;后者打满会导致receiver error或dropped计数上涨,需同步检查并调大。

为什么net.core.rmem_max改了但应用收包还是丢?
因为接收队列上限由两个独立参数共同控制:net.core.rmem_max(单个 socket 接收缓冲区上限)和net.core.netdev_max_backlog(设备层 ingress 队列长度)。前者管应用层,后者管内核从网卡驱动取包时的暂存队列。高吞吐场景下,后者打满会导致 netstat -s | grep "packet receive errors" 中出现 receiver error 或 dropped 计数上涨。
怎么临时调大net.core.netdev_max_backlog?
直接写入 sysctl 接口即可,无需重启网络服务:
echo 5000 > /proc/sys/net/core/netdev_max_backlog
验证是否生效:
cat /proc/sys/net/core/netdev_max_backlog
注意:该值不能超过 net.core.dev_weight 的 2 倍(默认 64),否则内核会静默截断为 dev_weight × 2。比如 dev_weight=128 时,设成 300 会被自动修正为 256。
如何让netdev_max_backlog永久生效?
写进 /etc/sysctl.conf 或独立配置文件(推荐后者,避免污染主配置):
echo "net.core.netdev_max_backlog = 5000" > /etc/sysctl.d/99-net-backlog.conf
然后加载:
sysctl --system
常见错误:只改 /etc/sysctl.conf 但没运行 sysctl -p;或用了 sysctl -p /etc/sysctl.conf 却漏掉 --system,导致 /etc/sysctl.d/ 下的文件不被加载。
net.core.rmem_max和netdev_max_backlog要一起调吗?
不一定。典型组合是:
- 突发小包风暴(如 DNS 洪泛)→ 优先加大
netdev_max_backlog - 长连接大流(如视频推流)→ 重点调
rmem_max和 socket 的SO_RCVBUF - 两者都瓶颈 → 先确认
netstat -s中哪类丢包计数上升,再针对性调整
过度调高 netdev_max_backlog 会增加内存占用和中断延迟,尤其在多队列网卡上,每个 RX 队列都共享这个 backlog,不是 per-queue 设置。











