首页/系统/Linux 内核与性能调优速查/网卡中断亲和与队列绑定
网络栈调优98 条

网卡中断亲和与队列绑定

/proc/interrupts 里每个网卡队列有独立中断号, 把中断绑定到固定核可减少迁移开销, 并可与收包应用同 NUMA 规划。

网卡中断绑核

支持多队列的网卡每个队列有独立中断号,可以在 /proc/interrupts 里看到,并通过 /proc/irq/<N>/smp_affinity_list 指定由哪些核处理。把中断绑定到固定核能减少中断迁移与缓存失效,还可以让收包核与业务核处在同一 NUMA 节点,降低跨节点访存。绑定前要先确认 irqbalance 的策略,否则手工设置会被守护进程按负载重新分配覆盖掉。

基本信息

查看中断grep -i <网卡名> /proc/interrupts
查看亲和cat /proc/irq/<N>/smp_affinity_list
设置亲和echo 2 > /proc/irq/<N>/smp_affinity_list
守护进程irqbalance,运行中可能覆盖手工设置
相关机制RPS/RFS 在软件层模拟多队列分发

典型使用场景

  • 软中断占用集中在单一核心(si 一核独高)
  • 高包速率场景下提升收包并行度
  • 让中断处理核与业务核位于同一 NUMA 节点
  • 配合容器网络做核间隔离规划
  • 排查中断在两个核之间来回迁移造成的抖动

定位与绑定

定位与绑定
grep -i ens5 /proc/interrupts                # 找到该网卡的队列中断号
cat /proc/irq/100/smp_affinity_list           # 当前由哪些核处理
cat /proc/irq/100/smp_affinity                # 掩码形式
cat /proc/irq/100/smp_affinity_list; sleep 5; cat /proc/interrupts | grep 100   # 看增量分布
echo 2 > /proc/irq/100/smp_affinity_list      # 只交给 2 号核
systemctl status irqbalance                  # 确认守护进程是否会覆盖
cat /sys/class/net/ens5/queues/rx-0/rps_cpus  # 软件层分发设置

相关文件读法

文件或命令含义注意
/proc/interrupts每核各中断的累计处理次数累计值,要比较两次采样的增量
smp_affinity_list该中断允许处理的核列表写入立即生效,重启后可能失效
smp_affinity同样的信息,十六进制掩码形式手算掩码易出错,优先用列表版
rps_cpus软件层收包分发的目标核需与硬件中断亲和成组规划
irqbalance 运行时会覆盖手工亲和设置,需要先决定是停用还是为其配置例外,再动手绑定。
容器内无法修改宿主 /proc/irq,网卡中断属于宿主层面;容器网络优化要与宿主基线一起规划。
多队列网卡的中断名通常是 ens5-TxRx-0 这类带队列后缀的形式,队列数量由驱动与中断合并设置决定;先用 grep 确认实际命名再逐队列规划目标核。

成组规划要点

  • 先看 /proc/interrupts 的逐核增量,找出实际热点核
  • 按队列把中断分散到多个核,避免全挤在同一核上
  • 中断核与业务核保持同 NUMA 节点,减少跨节点访存

易错点

  • 绑定后不验证:中断可能仍落在原核,应再看 /proc/interrupts 的增量分布
  • 忘记 irqbalance:手工设置被守护进程覆盖,表现像「改了没生效」
  • 与 RPS 或应用亲和冲突:多层设置相互覆盖,效果抵消
  • 只看总量不看逐核分布:定位不到软中断热点集中在哪一核
  • 在容器里尝试改 /proc/irq:权限与命名空间都不允许,必须回到宿主处理

数据来源与参考

  • Linux 内核文档 IRQ affinity 说明(stable-api 与 SMP IRQ Affinity)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌