4.3. 中断和 IRQ 调节
中断请求(IRQ)是用于服务的请求,在硬件层发出。可使用专用硬件线路或者跨硬件总线的信息数据包(消息信号中断,MSI)发出中断。
启用中断后,接收 IRQ 后会提示切换到中断上下文。内核中断调度代码会搜索 IRQ 号码机器关联的注册中断服务路由(ISR)列表,并按顺序调用 ISR。ISR 会确认中断并忽略来自同一 IRQ 的多余中断,然后在延迟的句柄中排队完成中断处理,并忽略以后的中断来结束 ISR。
/proc/interrupts
文件列出每个 I/O 设备中每个 CPU 的中断数,每个 CPU 核处理的中断数,中断类型,以及用逗号分开的注册为接收中断的驱动程序列表。(详情请参考 proc(5) man page:man 5 proc
)
IRQ 有一个关联的“类似”属性
smp_affinity
,该参数可以定义允许为 IRQ 执行 ISR 的 CPU 核。这个属性还用来提高程序性能,方法是为一个或者多个具体 CPU 核分配中断类似性和程序线程类似性。这可让缓存线可在指定的中断和程序线程之间共享。
具体 IRQ 数的中断近似性值是保存的相关的
/proc/irq/IRQ_NUMBER/smp_affinity
文件中,您可以作为 root 用户查看并修改该值。保存在这个文件中的值是一个十六进制字节掩码,代表系统中所有 CPU 核。
例如:要为四核服务器指定以太网驱动程序,首先要确定与该以太网驱动程序关联的 IRQ 数:
# grep eth0 /proc/interrupts 32: 0 140 45 850264 PCI-MSI-edge eth0
使用 IRQ 数定位正确的
smp_affinity
文件:
# cat /proc/irq/32/smp_affinity f
smp_affinity 的默认值为
f
,即可为系统中任意 CPU 提供 IRQ。将这个值设定为 1
,如下,即表示只有 CPU 0 可以提供这个中断:
# echo 1 >/proc/irq/32/smp_affinity # cat /proc/irq/32/smp_affinity 1
可使用逗号为不连续的 32 位组限定
smp_affinity
值。在有 32 个以上核的系统有这个要求。例如:以下示例显示在一个 64 核系统的所有核中提供 IRQ 40。
# cat /proc/irq/40/smp_affinity ffffffff,ffffffff
要只在 64 核系统的上 32 核中提供 IRQ 40,请执行:
# echo 0xffffffff,00000000 > /proc/irq/40/smp_affinity # cat /proc/irq/40/smp_affinity ffffffff,00000000
注意
在支持中断操作的系统中,修改 IRQ 的
smp_affinity
设置硬件以便决定在不影响内核的情况下,硬件层为具体 CPU 提供中断服务。