排查网卡中断绑定需查看/proc/irq/*/smp_affinity_list,通过/proc/interrupts获取IRQ编号,核对实际亲和性effective_affinity并停用irqbalance。改绑定不生效常见于isolcpus隔离、掩码错误或驱动不响应。单队列时调整绑定意义不大,应先启用多队列后再分别绑定。
Linux网卡中断绑定查看方法
作者:技术拾光
时间:2026-07-09
浏览:320
文章目录
先说一个核心判断:排查网卡中断绑定时,直接查看 /proc/irq/*/smp_affinity_list 就足够了,不要被 top 或 mpstat 显示的单核高负载表象迷惑——那些工具只告诉你哪个 CPU 在忙,却无法说明这个 CPU 究竟绑定了哪个中断。
如何快速定位网卡对应的 IRQ 编号
网卡的中断号不能靠猜测,需要从 /proc/interrupts 中提取。操作步骤并不复杂:
- 先用
nmcli device status或ip -br link show确认当前真实的网卡名称,例如enp1s0f0或ens33。 - 接着执行
grep -i "enp1s0f0" /proc/interrupts,将网卡名替换为你自己的。输出类似:
42: 1234567 0 0 0 890123 0 0 0 IR-PCI-MSI 32768-edge enp1s0f0-rx-0
第一列的42就是 IRQ 编号。如果末尾带有-rx-或-tx-后缀,说明已启用多队列,每个后缀对应一个独立的中断。 - 如果
grep没有找到结果,可以尝试用驱动名来搜索:先执行ethtool -i enp1s0f0 | grep driver获取驱动名(例如i40e或mlx5_core),再运行grep i40e /proc/interrupts。
如何确认当前 IRQ 绑定到了哪些 CPU
拿到 IRQ 编号后,有两个文件必须同时查看,缺一不可:
cat /proc/irq/42/smp_affinity_list:显示的是你“写入”的亲和性配置,输出为十进制的 CPU 编号列表。例如0,2,4,6表示该中断允许在这 4 个核心上运行;如果只输出0,则说明硬绑死在 CPU 0——这是单核瓶颈的直接证据。cat /proc/irq/42/effective_affinity:显示内核“实际执行”的绑定情况。如果它与smp_affinity_list不一致,很可能是irqbalance在后台悄悄干预。- 建议同时检查
systemctl is-active irqbalance,如果显示active,操作前请务必执行sudo systemctl stop irqbalance。
为什么修改了 smp_affinity_list 却没有生效
这是一个典型问题。通常并非权限或路径错误,而是忽略了以下三个细节:
- 目标 CPU 被内核隔离:运行
cat /proc/cmdline,如果看到isolcpus=1,2,则不要尝试将绑定写入 CPU 1 或 2,否则写入会静默失败甚至触发警告。 - 误用了
smp_affinity(十六进制掩码):x86 架构为 64 位,ARM 可能更宽,掩码长度错一位就容易全绑到 CPU 0。相比之下,smp_affinity_list是人眼可读的十进制列表,更加安全。 - 驱动不响应
smp_affinity_list:某些驱动(如mlx5_core)只认smp_affinity,但写入前必须先确认位宽。稳妥的做法是先尝试smp_affinity_list,失败后再查阅驱动文档。
网卡未开启多队列时,调整中断绑定意义不大
如果 ethtool -l enp1s0f0 显示 Combined: 1,说明硬件只开启了 1 个接收队列。这种情况下,即使调整 smp_affinity_list,也只有一个 IRQ 号可绑定,所有网络包最终仍然落在同一个中断上下文里。
真正应该做的不是调整绑定,而是:
- 先启用多队列:
sudo ethtool -l enp1s0f0 combined 4(通常设置为 CPU 核心数的一半,或匹配 NUMA 节点)。 - 再确认网卡是否支持 RPS:
ls /sys/class/net/enp1s0f0/queues/rx-*,看到多个rx-*目录才说明队列已激活。 - 最后才对每个
rx-0、rx-1对应的 IRQ 分别绑定到不同的 CPU 上。
中断绑定并非万能开关。它是多队列、NUMA 对齐以及 irqbalance 停用三者协同的结果。缺少任意一环,你所看到的都只是假象。
实用工具推荐
电子包浆
使用 ›绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
图片压缩
使用 ›选择画质和输出格式,预览压缩前后的大小。
相关文章