大家好,我是王鸽,今天这篇文章主要是讲怎么在实际中调试Linux中断这块, 以及确认中断下各个文件的含义。首次看一下中断底下的文件,这里举一个例子/proc/irq/55
cd /proc/irq/55$ lsaffinity_hint effective_affinity effective_affinity_list node smp_affinity smp_affinity_list spurious$ cat node0$ cat affinity_hint0$ cat effective_affinity0$ cat effective_affinity_list$ cat smp_affinity3$ cat smp_affinity_list0-1$ cat spuriouscount 0unhandled 0last_unhandled 0 ms
/proc/irq/55/目录下这些文件字段的具体含义,这些文件都是 Linux 内核提供的用于管理和查看中断(IRQ)CPU 亲和性的关键接口,主要用于控制硬件中断在哪些 CPU 核心上处理。各字段详细解释
1. affinity_hint
含义
中断的推荐亲和性掩码(hint 意为 “提示 / 建议”)。
作用
由硬件或驱动程序提供,内核 / 系统建议你将该中断绑定到这些 CPU 核心上(仅为建议,不是强制)。
格式
十六进制的 CPU 掩码(比如00000003表示允许 CPU0 和 CPU1)。
特点
只读文件,无法手动修改。
2. effective_affinity
含义
中断当前实际生效的亲和性掩码。
作用
显示该中断最终被允许在哪些 CPU 核心上运行(是smp_affinity与系统其他限制(如 CPU 隔离、拓扑限制)结合后的结果)。
格式
十六进制 CPU 掩码。
特点
只读文件,反映 “最终实际生效” 的状态,而非你手动设置的smp_affinity。
3. effective_affinity_list
含义
effective_affinity的易读列表形式。
作用
和effective_affinity功能完全一致,但用十进制的 CPU 核心列表展示(更直观)。
示例
如果effective_affinity是00000003,这个文件会显示0-1(表示 CPU0、CPU1)。
特点
只读,适合快速查看,无需换算十六进制。
4. node
含义
中断关联的NUMA 节点(非统一内存访问节点)。
作用
在多 NUMA 架构的服务器上,标识该中断所属的 NUMA 节点(比如0表示节点 0),用于优化内存访问性能。
特点
只读,仅在 NUMA 系统上有意义,普通单机(非 NUMA)可能显示0。
5. smp_affinity
含义
中断的手动设置亲和性掩码(核心配置文件)。
作用
你可以手动修改这个文件,指定该中断允许在哪些 CPU 核心上处理(是最常用的中断绑核配置文件)。
格式
十六进制 CPU 掩码(默认通常是ffffffff,表示允许所有 CPU)。
修改示例
echo 00000001 > /proc/irq/55/smp_affinity(将 IRQ55 绑定到 CPU0)。
内核提供了设置中断亲和性的函数:
intirq_set_affinity(unsignedint irq, conststruct cpumask*cpumask);
参数irq是Linux中断号,参数cpumask是处理器位掩码
6. smp_affinity_list
含义
smp_affinity的易读列表形式。
作用
和smp_affinity功能一致,但支持用十进制列表修改 / 查看(更友好)。
示例
echo 0-2 > /proc/irq/55/smp_affinity_list(将 IRQ55 绑定到 CPU0、1、2)。
特点
可读写,是新手配置中断绑核的首选(无需计算十六进制)。
7. spurious
含义
中断的虚假 / 无效中断统计信息。
作用
记录该 IRQ 发生的 “虚假中断” 次数(比如硬件异常、驱动问题导致的无意义中断)。
内容示例
count 0
unhandled 0
last_unhandled 0
- 只读,用于排查中断异常问题(如果数值持续增加,可能是硬件 / 驱动故障)。
这个文件我觉有点意思,在于应用层同事监听中断时候,说中断没有触发,这个时候就可以查看这个文件,底层驱动中断有没有异常。补充一下知识点
CPU 亲和性
简单说就是 “指定中断只能在哪些 CPU 上跑”,目的是减少 CPU 缓存失效、提升中断处理效率(比如把网卡中断绑定到独立 CPU 核心)。
十六进制掩码换算
比如00000001(二进制00000001)= CPU0;00000003(二进制00000011)= CPU0+CPU1;00000008(二进制00001000)= CPU3。
修改权限
修改smp_affinity/smp_affinity_list需要 root 权限(sudo / 切换到 root 用户)。
实际中的例子
利用echo命令将CPU掩码写入/proc/irq /中断ID/smp_affinity文件中,即可实现修改某一中断的CPU亲和性。
...... 35: 0 0 XBurst2-irqchip 27 13300000.felix 39: 55380 47342 XBurst2-irqchip 31 lcdc-1 55: 661 2355 XBurst2-irqchip 47 uart0......
例如第55号中断在cpu0上响应,通过以下修改可以实现只在cpu1上响应。
echo 2 > /proc/irq/55/smp_affinity
再次查看interrupts
\cat /proc/interrupts
........ 35: 0 0 XBurst2-irqchip 27 13300000.felix 39: 55384 47342 XBurst2-irqchip 31 lcdc-1 55: 661 2419 XBurst2-irqchip 47 uart0........
连续cat查看发现其只在cpu1上响应。
总结
核心配置文件
smp_affinity(十六进制掩码)和smp_affinity_list(易读列表)是手动设置中断绑核的核心文件,后者更适合新手。
实际生效状态
effective_affinity/effective_affinity_list显示最终生效的绑核配置(可能受系统限制,和手动设置的不完全一致)。
辅助信息
affinity_hint是推荐配置,node关联 NUMA 节点,spurious用于排查虚假中断问题。
谢谢阅读!