29.4. 中断请求概述

中断请求或 IRQ 是从硬件立即发送到处理器的信号。系统中的每个设备都会被分配一个或多个 IRQ 编号,允许它发送唯一的中断。启用中断后,接收中断请求的处理器会立即暂停当前应用程序线程执行,以处理中断请求。

由于中断中断会停止正常操作,因此高中断率可能会严重降低系统性能。通过配置中断的关联性,或者向批处理中发送多个较低优先级中断(协调多个中断),这可以减少中断所花费的时间。

中断请求具有关联的关联性属性 smp_affinity,它定义了处理中断请求的处理器。要提高应用性能,请将中断关联和进程关联分配到同一处理器,或分配到同一内核上的处理器。这允许指定的中断和应用程序线程共享缓存行。

在支持中断中断的系统上,修改中断请求的 smp_affinity 属性可设置硬件,以便决定使用特定处理器在硬件级别提供中断,而无需在内核中干预。

29.4.1. 手动平衡中断

如果您的 BIOS 导出它的 NUMA 拓扑,则 irqbalance 服务可自动为节点上对请求服务的硬件进行中断请求。

步骤

  1. 检查哪些设备对应于您要配置的中断请求。
  2. 查找平台的硬件规格。检查您系统上的芯片组是否支持分发中断。

    1. 如果这样做,您可以按照以下步骤中的内容配置中断交付。另外,检查您的芯片组用来平衡中断的算法。有些 BIOS 有一些选项来配置中断交付。
    2. 如果没有,您的芯片组总会将所有中断路由到单个静态 CPU。您无法配置使用哪些 CPU。
  3. 检查系统上使用了 Advanced Programmable Interrupt Controller (APIC) 模式:

    $ journalctl --dmesg | grep APIC

    在这里,

    • 如果您的系统使用 flat 以外的模式,您可以看到一个类似于 Setting APIC routing to physical flat 的行。
    • 如果看不到这个信息,代表您的系统使用 flat 模式。

      如果您的系统使用 x2apic 模式,您可以在 引导装载程序配置 的内核命令行中添加 nox2apic 选项来禁用它。

      只有非物理平面模式(flat)支持将中断分发到多个 CPU。这个模式仅适用于最多 8 个 CPU 的系统。

  4. 计算 smp_affinity 掩码。有关如何计算 smp_affinity mask 的更多信息,请参阅 设置 smp_affinity 掩码

其他资源

  • journalctl (1) taskset (1) man page

29.4.2. 设置 smp_affinity 掩码

smp_affinity 值存储为代表系统中所有处理器的十六进制位掩码。每个位配置不同的 CPU。最重要的位是 CPU 0。

掩码的默认值为 f,这意味着可在系统中的任何处理器上处理中断请求。将此值设置为 1 表示只有处理器 0 可以处理中断。

步骤

  1. 二进制代码中,将值 1 用于处理中断的 CPU。例如,要设置 CPU 0 和 CPU 7 以处理中断,请使用 0000000010000001 作为二进制代码:

    表 29.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

  2. 将二进制代码转换为十六进制代码:

    例如,使用 Python 转换二进制代码:

    >>> hex(int('0000000010000001', 2))
    
    '0x81'

    在有 32 个处理器的系统上,您必须限制离散的 32 位组的 smp_affinity 值。例如,如果您只想 64 位处理器系统的第一个 32 个处理器来服务中断请求,请使用 0xffffffff,00000000

  3. 特定中断请求的中断关联性值存储在关联的 /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