31.4. 中断请求概述
中断请求或 IRQ 是从硬件立即发送到处理器的信号。系统中的每个设备都会被分配一个或多个 IRQ 编号,允许它发送唯一的中断。启用中断后,接收中断请求的处理器会立即暂停当前应用程序线程执行,以处理中断请求。
由于中断中断会停止正常操作,因此高中断率可能会严重降低系统性能。通过配置中断的关联性,或者向批处理中发送多个较低优先级中断(协调多个中断),这可以减少中断所花费的时间。
中断请求具有关联的关联性属性 smp_affinity
,它定义了处理中断请求的处理器。要提高应用性能,请将中断关联和进程关联分配到同一处理器,或分配到同一内核上的处理器。这允许指定的中断和应用程序线程共享缓存行。
在支持中断中断的系统上,修改中断请求的 smp_affinity
属性可设置硬件,以便决定使用特定处理器在硬件级别提供中断,而无需在内核中干预。
31.4.1. 手动平衡中断
如果您的 BIOS 导出它的 NUMA 拓扑,则 irqbalance
服务可自动为节点上对请求服务的硬件进行中断请求。
步骤
- 检查哪些设备对应于您要配置的中断请求。
查找平台的硬件规格。检查您系统上的芯片组是否支持分发中断。
- 如果这样做,您可以按照以下步骤中的内容配置中断交付。另外,检查您的芯片组用来平衡中断的算法。有些 BIOS 有一些选项来配置中断交付。
- 如果没有,您的芯片组总会将所有中断路由到单个静态 CPU。您无法配置使用哪些 CPU。
检查系统上使用了 Advanced Programmable Interrupt Controller (APIC) 模式:
$ journalctl --dmesg | grep APIC
在这里,
-
如果您的系统使用
flat
以外的模式,您可以看到一个类似于Setting APIC routing to physical flat
的行。 如果看不到这个信息,代表您的系统使用
flat
模式。如果您的系统使用
x2apic
模式,您可以在引导装载程序配置
的内核命令行中添加nox2apic
选项来禁用它。只有非物理平面模式(
flat
)支持将中断分发到多个 CPU。这个模式仅适用于最多8
个 CPU 的系统。
-
如果您的系统使用
-
计算
smp_affinity 掩码
。有关如何计算smp_affinity 掩码
的更多信息,请参阅 设置 smp_affinity 掩码。
其他资源
-
journalctl (1)
和taskset (1)
man page
31.4.2. 设置 smp_affinity 掩码
smp_affinity
值存储为代表系统中所有处理器的十六进制位掩码。每个位配置不同的 CPU。最重要的位是 CPU 0。
掩码的默认值为 f
,这意味着可在系统中的任何处理器上处理中断请求。将此值设置为 1 表示只有处理器 0 可以处理中断。
步骤
二进制代码中,将值 1 用于处理中断的 CPU。例如,要设置 CPU 0 和 CPU 7 以处理中断,请使用
0000000010000001
作为二进制代码:表 31.1. CPU 的二进制位 CPU
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
二进制
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
将二进制代码转换为十六进制代码:
例如,使用 Python 转换二进制代码:
>>> hex(int('0000000010000001', 2)) '0x81'
在有 32 个处理器的系统上,您必须限制离散的 32 位组的
smp_affinity
值。例如,如果您只想 64 位处理器系统的第一个 32 个处理器来服务中断请求,请使用0xffffffff,00000000
。特定中断请求的中断关联性值存储在关联的
/proc/irq/irq_number/smp_affinity
文件中。在此文件中设置smp_affinity
mask:# echo mask > /proc/irq/irq_number/smp_affinity
其他资源
-
journalctl (1)
,irqbalance (1)
, 和taskset (1)
man pages