网卡中断绑核
支持多队列的网卡每个队列有独立中断号,可以在 /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 节点,减少跨节点访存