如何在 Ubuntu 上使用 IRQBALANCE_BANNED_CPUS 禁止硬件中断?

如何在 Ubuntu 上使用 IRQBALANCE_BANNED_CPUS 禁止硬件中断?

我想禁止某些 CPU 的中断。我听说过 IRQBALANCE_BANNED_CPUS 选项。我看到 irqbalance 正在我的机器后台运行。我在哪里可以编辑以及如何配置该选项?例如,我想将 CPU 2、3、4、5 排除在中断之外。参数描述符是:

提供 irqbalance 应忽略且绝不分配中断的 CPU 掩码

掩码是什么意思?我应该在哪里使用该选项配置 irqbalance?

编辑1:如何知道我的配置有效,换句话说,我的 CPU 没有收到中断?我正在检查 /proc/interrupts,但那里的一些数字在增加。

编辑2:现在我使用 IRQBALANCE_BANNED_CPUS=3e 启动我的机器,因此只有 CPU 0 未被禁止中断。所以我应该看到 cpo0 收到大量中断,而其他 cpu 未收到中断,对吗?这是我的 /proc/interrupts。所有 cpu 的粗体行都在发生变化。第 22、24、35 行和 LOC 正在发生变化。

            CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       
   0:         26          0          0          0          0          0   IO-APIC-edge      timer
   1:          2          0          0          0          0          0   IO-APIC-edge      i8042
   6:          3          0          0          0          0          0   IO-APIC-edge      floppy
   8:          1          0          0          0          0          0   IO-APIC-edge      rtc0
   9:          0          0          0          0          0          0   IO-APIC-fasteoi   acpi
  12:          4          0          0          0          0          0   IO-APIC-edge      i8042
  14:      13556          0          0          0          0          0   IO-APIC-edge      ata_piix
  15:          0          0          0          0          0          0   IO-APIC-edge      ata_piix
  18:          0          0          0          0          0          0   IO-APIC-fasteoi   ata_piix
  19:          2          0          0          0          0          0   IO-APIC-fasteoi   ohci1394
  20:          3          0          0          0          0          0   IO-APIC-fasteoi   ehci_hcd:usb2, uhci_hcd:usb3, uhci_hcd:usb6
  21:        197        635         39          0          0          0   IO-APIC-fasteoi   uhci_hcd:usb4, uhci_hcd:usb7, HDA Intel
  22:        344       3506          0        702          0          0   IO-APIC-fasteoi   ehci_hcd:usb1, uhci_hcd:usb5, uhci_hcd:usb8
  24:        162         48          0          0          0          0   IO-APIC-fasteoi   nvidia
  35:        174          0         47          0          0          0   IO-APIC-fasteoi   nvidia
  53:       3517          0          0          0          0          0   PCI-MSI-edge      eth0
 NMI:          0          0          0          0          0          0   Non-maskable interrupts
 LOC:      11007       8840       6480       5652       4272       3046   Local timer interrupts
 SPU:          0          0          0          0          0          0   Spurious interrupts
 PMI:          0          0          0          0          0          0   Performance monitoring interrupts
 PND:          0          0          0          0          0          0   Performance pending work
 RES:        292        169        217        125        122        126   Rescheduling interrupts
 CAL:         86        280        254        292        293        291   Function call interrupts
 TLB:       1147       1031       1348        616        177        322   TLB shootdowns
 TRM:          0          0          0          0          0          0   Thermal event interrupts
 THR:          0          0          0          0          0          0   Threshold APIC interrupts
 MCE:          0          0          0          0          0          0   Machine check exceptions
 MCP:          2          2          2          2          2          2   Machine check polls
 ERR:          5
 MIS:          0

编辑3:看起来像IRQBALANCE_BANNED_CPUS 选项在 Ubuntu 上被完全忽略。我尝试使用 1, 3e 重新启动我的机器,结果到处都是中断。当我通过设置 ENABLED=0 禁用 irqbalance 时,我得到了一个干净的 /proc/interrupts,仅在 cpu0 上,没有其他 cpu。

答案1

你在/etc/默认/irqbalance。我在/etc/init.d/irqbalance。但是该设置的有效值是什么?摘自 Red Hat 的手册页:

这是一个不带前导“0x”的十六进制掩码,在具有大量处理器的系统上,每组八个十六进制数字用逗号“,”分隔。这 export IRQBALANCE_BANNED_CPUS=fc0将阻止 irqbalance 将中断分配给第 7 到第 12 个 CPU(cpu6-cpu11)或 export IRQBALANCE_BANNED_CPUS=ff000000,00000001阻止 irqbalance 将中断分配给第 1 个(cpu0)和第 57 到第 64 个 CPU(cpu56-cpu63)。

面具的概念在维基百科上有解释。读完后再回来。让我们分解一下 Red Hat 的第一个例子。十六进制中写为 fc0 的数字在二进制中写为 111111000000。从右到左扫描(即从最低有效位最高有效位),有六个零,表示第 1-5 个 cpu (cpu0-cpu5) 可以分配中断;然后是六个一,表示第 7-12 个 cpu (cpu6-cpu11) 不会分配中断。

听起来你想允许 cpu0 和 cpu1 接收中断,但阻止 cpu2、cpu3、cpu4 和 cpu5 被分配中断。这意味着你需要两个零和四个一,或者 111100。这是十六进制的 3C。因此,你需要创建/etc/默认/irqbalance内容

ENABLED="1"
ONESHOT="0"
IRQBALANCE_BANNED_CPUS="3f"

要查看发生了什么,请尝试

$ sudo service irqbalance stop
Stopping SMP IRQ Balancer: irqbalance.
$ source /etc/default/irqbalance 
$ sudo irqbalance --debug

答案2

irqbalance 错误导致 IRQBALANCE_BANNED_CPUS 无法在 NUMA 机器上工作:http://code.google.com/p/irqbalance/issues/detail?id=43

截至目前,1.0.5 是最新 irqbalance 版本,并且尚未修复该问题。

答案3

您必须按照上述方法使用 3c 才能使其工作。更高版本会自动执行此操作(至少在 debian/sid 上的 v1.9 中)

答案4

除了上面关于解决 irqbalance 问题的建议外,还有一个用于查看 irqbalance 运行导致的中断亲和性的有用命令:

查找 /proc/irq/-name smp_affinity-print-exec cat {};|更少

相关内容