linux怎么把 RX ring 调大

好问题,而且你这个问题非常专业 👍
先给你一句结论,然后再展开说「为什么」。


一、结论先行(非常重要)

RX ring 不能用 sysctl
只能用 ethtool -G(驱动层参数)

sysctl 管的是 内核协议栈
RX ring 是 网卡驱动 / NIC 硬件队列

👉 层级完全不同


二、为什么 sysctl 调不了 RX ring?(核心原理)

RX ring 是什么?

  • NIC 上的 DMA descriptor ring

  • 包先到这里,再进内核

  • 满了 → 硬件直接丢包

sysctl 能管什么?

  • net.core.rmem_* → socket buffer

  • net.ipv4.tcp_* → TCP 行为

  • net.core.netdev_* → backlog

📌 这些都发生在 RX ring 之后

 
网线
NIC RX ring
← ← ←
你现在丢在这一步
softirq / napi
netdev backlog
socket buffer

👉 ring 满了,sysctl 根本看不到包


三、正确姿势:用 ethtool 调 RX ring ✅

1️⃣ 先看当前 & 最大值

 
ethtool -g ens5f0np0

你会看到类似:

 
Pre-set maximums:
RX: 8192 TX: 8192
Current hardware
settings: RX: 1024
TX: 1024

2️⃣ 调到最大或接近最大(推荐)

 
ethtool -G ens5f0np0 rx 4096 tx 4096
ethtool -G ens5f1np1 rx 4096 tx 4096

📌 原则:

  • 25G:至少 4096

  • 内存富裕:可以直接拉满


3️⃣ 验证是否生效

 
ethtool -g ens5f0np0

四、那 sysctl 在这里完全没用吗?不是的

sysctl 的作用是 “兜底”

在 RX ring 之后:

推荐配合的 sysctl(25G + bond)

 
sysctl -w net.core.netdev_max_backlog=250000
sysctl -w net.core.rmem_max=268435456
sysctl -w net.core.rmem_default=268435456

📌 作用:

  • NIC → softirq → backlog 时不丢

  • 但前提是 RX ring 不先爆


五、你现在这个场景的“最佳实践组合”🔥

 
1️⃣ ethtool -G ← 必须 2️⃣ xmit_hash_policy=layer3+4 3️⃣ IRQ / RSS 分散 4️⃣ sysctl 兜底

少任何一个,在 25G + bond 下都可能掉包。


六、常见误区澄清(你可能正好踩过)

❌ “我把 rmem 调很大了,为什么还丢?”

👉 因为包死在 RX ring

❌ “netdev_max_backlog 很大了”

👉 ring 满了根本进不来

❌ “调 sysctl 就能解决所有网络问题”

👉 对 1G 可能行,对 25G 不行


七、下一步我建议你做什么(按顺序)

  1. ethtool -g 看最大值

  2. ethtool -G 拉到 ≥4096

  3. 再跑一次 ping -f

  4. rx_steer_missed_packets 是否停止增长

如果你愿意,把:

 
ethtool -g ens5f0np0 ethtool -g ens5f1np1

贴出来,我可以直接告诉你调到多少最合适,不拍脑袋。

 
Ring parameters for ens5f0np0: Pre-set maximums: RX: 8192 RX Mini: n/a RX Jumbo: n/a TX: 8192 Current hardware settings: RX: 1024 RX Mini: n/a RX Jumbo: n/a TX: 1024
 

太好了,这个输出一出来,方案就非常明确了 👍
一句话:你现在 25G 网卡用的是 1G 时代的默认 ring,大概率就是它在拖后腿。


一、直接给结论(不绕弯)

  • 硬件最大8192

  • 你现在用的1024

  • 在 25G + bond + bridge 场景下:❌ 严重偏小

👉 必须调大,至少 4096,推荐直接 8192


二、立刻可执行的正确调整命令 ✅

🔥 强烈推荐(一步到位)

 
ethtool -G ens5f0np0 rx 8192 tx 8192
ethtool -G ens5f1np1 rx 8192 tx 8192

⚠️ 说明:

  • 在线生效

  • 不会断链(极少数驱动可能瞬断 <1s)

  • 占用内存可忽略(几十 MB)


三、调完后一定要做的三件事(验证)

1️⃣ 确认生效

 
ethtool -g ens5f0np0

应看到:

 
Current hardware settings: RX: 8192 TX: 8192

2️⃣ 清零观察丢包指标(可选但推荐)

 
ethtool -S ens5f0np0 | grep rx_steer # 记住当前值

3️⃣ 再跑一次压测

 
ping -f -c 5000 <同网段IP>

然后再看:

 
ethtool -S ens5f0np0 | grep rx_steer

👉 理想结果:不再增长


四、为什么 8192 在你这里是“刚需”?(技术原因)

粗算一下:

  • 25G

  • 小包(ping flood / VXLAN / overlay)

  • PPS 极高

  • bond hash + bridge tap 会造成突发流量

1024 ring ≈ 几百微秒就被吃空

而 8192:

  • 能吸收 burst

  • 给 softirq / RPS 足够时间

  • rx_steer_missed_packets 自然消失


五、强烈建议一起做的 2 个配套优化(不然效果打折)

① 确认你已经是 layer3+4

 
cat /sys/class/net/bond0/bonding/xmit_hash_policy

应是:

 
layer3+4

② 把 netdev backlog 稍微兜底一下

 
sysctl -w net.core.netdev_max_backlog=250000

(这一步不是必须,但有益)


六、一个非常重要的提醒(90% 的人会忽略)

ring 参数重启会丢失

持久化方法(systemd)

 
# /etc/systemd/system/ethtool-ring.service
[Unit] Description=Set NIC ring buffer
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/ethtool -G ens5f0np0 rx 8192 tx 8192
ExecStart=/usr/sbin/ethtool -G ens5f1np1 rx 8192 tx 8192
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
 
systemctl daemon-reload
systemctl enable ethtool-ring --now

七、现在可以给你一个“很有把握的判断”

你之前看到的 rx_steer_missed_packets + ping -f 丢包,
在 RX ring 调到 8192 + layer3+4 之后,80%~90% 会直接消失。

如果你愿意,下一步我可以:

  • 🔧 帮你 检查 IRQ / RSS 是否还集中

  • 🔧 看看 TX ring 是否也有瓶颈

  • 🔧 或帮你 做一轮完整的 25G 网络验收 checklist

你现在可以先把 ring 调了,然后把 调前 / 调后 ping 结果贴出来,我可以帮你确认是不是已经“彻底治好了”

posted @ 2026-01-27 09:35  技术颜良  阅读(3)  评论(0)    收藏  举报