调大 net.core.netdev_max_backlog 仅在软中断处理瓶颈(si高、rcvbuferrors增长、网卡与协议栈收包数差值突增)时有效,须同步优化rss和irq均衡,否则无效甚至恶化;它不解决listenoverflows或tcpbacklogdrop等tcp层问题。

调大 net.core.netdev_max_backlog 本身不会直接“提升内核处理报文速率”,它只是在软中断(softirq)处理不过来时,多给网卡驱动留点缓冲空间,避免丢包。真正起作用的前提是:你已经确认软中断成了瓶颈,且其他协同参数没配好——否则改了也没用,甚至更差。
先确认是不是真需要调这个值
盲目修改容易掩盖真实问题。重点看三件事:
- 监控
si(softirq)CPU 使用率是否持续高于 60%~70%,特别是在高吞吐、小包场景下 - 检查丢包计数:
cat /proc/net/snmp | grep -i "RcvbufErrors"—— 这个值在内核 5.10+ 中准确反映 netdev backlog 溢出;老内核可结合/proc/net/netstat中TcpExt: ListenOverflows辅助判断(但不完全等价) - 比对收包数量差异:用
ethtool -S eth0 | grep rx_packets得到网卡硬件收包数,再用netstat -s | grep "segments received"得到协议栈接收数,差值明显增大且伴随si高,才说明 backlog 真被压满
只调这个值大概率无效,必须同步优化软中断分发
如果所有网络中断都打到一个 CPU 上,再把 backlog 调到 10 万也没用——那个 CPU 的 softirq 根本处理不过来。关键要让流量分散:
- 开启并均衡 RSS(Receive Side Scaling):
ethtool -L eth0 combined $N,其中$N一般设为逻辑 CPU 总数 - 手动绑定网卡 IRQ 到不同 CPU:
echo 1 > /proc/irq/*/smp_affinity_list(需按实际 IRQ 编号操作,推荐用irqbalance或脚本批量设置) - 检查
/proc/interrupts中各 CPU 的eth0相关中断分布是否均匀
合理设置值并验证效果
默认值通常是 1000,对千兆以下或大包业务够用;10G+ 小包场景建议从 3000~6000 起步,不要一步到位设几万:
- 临时生效:
sysctl -w net.core.netdev_max_backlog=5000 - 永久生效:写入
/etc/sysctl.conf后运行sysctl -p - 验证是否生效:
sysctl net.core.netdev_max_backlog或cat /proc/sys/net/core/netdev_max_backlog - 上线后持续观察
RcvbufErrors是否停止增长、si是否回落、端到端延迟和丢包率是否改善
别和 TCP 层 backlog 混淆
这个参数和以下常见问题无关,调它解决不了:
-
ListenOverflows:那是net.core.somaxconn或应用accept()太慢,属于全连接队列溢出 -
TCPBacklogDrop:那是 socket 接收队列满,由net.core.rmem_max和应用读取速度决定 - TCP 重传、乱序、窗口收缩:属于协议栈行为,需查
net.ipv4.tcp_*类参数











