ethtool -l eth0
cat /proc/interrupts | grep eth0
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus

16 核机器上 CPU0 的 si 长期 95%,其余核都在 5% 以下,/proc/interrupts 里 eth0 的队列全压在 CPU0。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:网卡多队列没开或者中断亲和性没配,所有硬中断都落到同一个核。软中断处理跟硬中断同核,收包越多这个核越忙。

「网卡中断绑核」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:先用 ethtool -l 确认网卡队列数;开 RPS 把收包分散到多核;把中断亲和性分到不同 CPU;再观察各核 si 分布。

确认没问题再收工,分散后 CPU0 的 si 从 95% 降到 18%,各核负载接近,收包吞吐提升 2.3 倍。

作者 9823189