排查Linux网络中断漂移,本质是确认网卡中断是否被动态迁移、是否集中于少数核、是否与关键业务争用CPU;需绕过nmcli,直接通过/proc/interrupts查多队列IRQ,用watch观察计数增长趋势,结合top看%si波动,再通过smp_affinity_list绑定指定CPU并停用irqbalance验证效果。

排查 Linux 网络中断漂移,本质是确认网卡中断是否被动态迁移、是否集中于少数核、以及是否与关键业务发生 CPU 争用。nmcli 不参与中断管理,必须绕过它,直接操作内核中断接口。
定位网卡对应的所有 IRQ 号
万兆网卡普遍启用多队列(RSS),每个 RX/TX 队列对应独立 IRQ。不能只查一个中断号:
- 先用 nmcli device status 或 ip link show up 确认设备名(如 enp1s0f0)
- 再执行 grep -i "enp1s0f0" /proc/interrupts,关注带 -rx-、-tx-、-event- 后缀的行
- 输出中每行第一列即 IRQ 编号;同一设备名可能对应多个 IRQ(例如 45、46、47…),需逐个记录
- 不确定驱动类型时,用 ethtool -i enp1s0f0 查看 driver 字段(如 i40e、ice、mlx5_core),再用 grep i40e /proc/interrupts 辅助交叉验证
确认中断是否发生漂移或单核堆积
仅看静态值不够,要观察实时变化趋势:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 运行 watch -n 0.5 'grep enp1s0f0 /proc/interrupts',观察各 IRQ 计数在不同 CPU 列的增长是否均衡
- 若某 IRQ 的计数只在第 0 列猛增,其余列为 0,说明该中断被硬绑定在 CPU 0 —— 这不是漂移,而是配置僵化
- 若计数在不同列间来回跳变(比如前一秒在 CPU 2,下一秒跳到 CPU 5),且无规律,才是 irqbalance 主动迁移导致的“漂移”
- 同步运行 top -1 并按 1 显示各核负载,重点观察 %si(软中断)是否随中断计数跳变而同步波动
检查并设置 IRQ 亲和性
优先使用 smp_affinity_list,它比十六进制掩码更直观、容错性更强:
- 对每个 IRQ(如 45),执行 cat /proc/irq/45/smp_affinity_list 查当前绑定核
- 若输出为单个数字(如 0),说明中断被锁死在单核,存在瓶颈风险
- 若输出为空或报错,尝试 cat /proc/irq/45/smp_affinity,将十六进制值转为 CPU 编号(如 00000003 → CPU 0 和 1)
- 写入新绑定:如将 IRQ 45 固定到 CPU 2 和 3,执行 echo "2,3" > /proc/irq/45/smp_affinity_list
- 部分驱动(如 mlx5_core)仅支持 smp_affinity_list,不响应 smp_affinity 写入
停用 irqbalance 并防止回滚
irqbalance 是中断漂移的根源,但直接 kill 守护进程不够:
- 执行 systemctl stop irqbalance && systemctl disable irqbalance 彻底停用
- 检查 cat /proc/cmdline 是否含 isolcpus=,避免把中断绑到被隔离的核上
- 重启后配置失效?把 echo 命令写入 systemd service 或 /etc/rc.local,或通过 udev 规则在网卡加载时自动触发
- 验证生效:修改后再次 watch 中断计数,确认增长稳定落在指定 CPU 列,且 cat /proc/irq/45/effective_affinity 输出与 smp_affinity_list 一致

















