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


9

我想禁止某些CPU的中断。我听说过IRQBALANCE_BANNED_CPUS选项。我看到irqbalance在我的计算机的后台运行。我在哪里进行编辑以及如何配置该选项?例如,我要从中断中排除cpus 2、3、4、5。参数描述符为:

提供cpus的掩码,irqbalance应该忽略该掩码,并且永远不要将中断分配给

口罩是什么意思?以及在哪里使用该选项配置irqbalance?

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

EDIT2:现在,我以IRQBALANCE_BANNED_CPUS = 3e引导了我的机器,因此,只有CPU 0才被禁止中断。因此,我应该期望看到cpo0接收到许多中断,而其他cpus没有接收到中断,对吗?这是我的/ proc / interrupts。粗体字表示所有cpus。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

EDIT3:看起来IRQBALANCE_BANNED_CPUS选项在Ubuntu上完全被忽略。我尝试用1、3e重新启动计算机,并全部中断。就在我通过设置ENABLED = 0禁用irqbalance时,我只在cpu0上获得了干净的/ proc / interrupts,而没有其他cpu。

Answers:


7

您在/ etc / default / irqbalance中设置IRQBALANCE_BANNED_CPUS。我在/etc/init.d/irqbalance中找到了这个。但是该设置的有效值是多少?从红帽的手册页:

这是一个不带前导“ 0x”的十六进制掩码,在具有大量处理器的系统上,每组八个十六进制数字以逗号“,”分隔。即 export IRQBALANCE_BANNED_CPUS=fc0可以防止irqbalance从分配IRQ到第7至12的CPU(CPU6-CPU11),或 export IRQBALANCE_BANNED_CPUS=ff000000,00000001将防止irqbalance从到第1(CPU0)和第57第64的CPU(cpu56,cpu63)分配IRQ。

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

听起来您想允许cpu0和cpu1接收中断,但阻止为cpu2,cpu3,cpu4和cpu5分配中断。这意味着您需要两个零和四个一,或111100。这是十六进制的3C。因此,您将使用以下内容创建/ etc / default / 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

感谢您的解释。这里的困惑是:到6 CPU计算机上的BAN CPU 0。我是否使用:000001(1)或111110(3e)。是第一个吧?
TraderJoeChicago 2012年

请检查我对原始问题的修改。我需要知道如何读取/ proc / interrupts以确保我的配置正常工作,并且我的cpu被禁止使用中断。谢谢!
TraderJoeChicago 2012年

参见我的编辑编号3:除非我们搞砸了面具,否则IRQBALANCE_BANNED_CPUS正在Ubuntu上被入侵。但是我尝试了1e和3e都没有成功。:(
TraderJoeChicago 2012年

请参阅我的调试编辑。
sciurus

2
不。我可以确认它在Ubuntu 10.04.1上不起作用。此配置选项IRQBALANCE_BANNED_CPUS =“ 1”被忽略。
TraderJoeChicago 2012年


0

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


0

在上述有关对irqbalance问题进行故障排除的建议中添加了一个有用的命令,用于查看由irqbalance的运行导致的中断相关性:

find /proc/irq/ -name smp_affinity | xargs cat | less
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.