Как запретить аппаратные прерывания с IRQBALANCE_BANNED_CPUS в Ubuntu?

Я хотел бы запретить прерывания от определенных процессоров. Я слышал об опции IRQBALANCE_BANNED_CPUS. Я вижу, что на заднем плане моей машины работает irqbalance. Куда мне обратиться, чтобы отредактировать и как настроить эту опцию? Например, я хочу исключить процессор 2,3,4,5 из прерываний. Дескриптор аргумента:

Предоставляет маску процессора, которую irqbalance должен игнорировать и никогда не назначать прерывания

Что это значит под маской? И где я могу настроить irqbalance с этой опцией?

EDIT1: Как узнать, что моя конфигурация действует, другими словами, что мой процессор не получает прерываний? Я проверяю /proc/interrupts, но некоторые цифры там увеличиваются.

РЕДАКТИРОВАТЬ 2: Теперь я загрузил свою машину с IRQBALANCE_BANNED_CPUS=3e, так что только CPU 0 НЕ заблокирован от прерываний. Так что я должен ожидать, что cpo0 получит много прерываний, а другой процессор не получит прерываний, верно? Вот мой /proc/interrupts. Строки, выделенные жирным шрифтом, изменяются для ВСЕХ процессоров. Строки 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 и получил прерывания повсюду. Просто когда я отключаю irqbalance, устанавливая ENABLED=0, я получаю чистые /proc/interrupts только на процессоре cpu0, а не на другом процессоре.

4 ответа

Вы устанавливаете IRQBALANCE_BANNED_CPUS в /etc/default/irqbalance. Я нашел это, посмотрев в /etc/init.d/irqbalance. Но каковы допустимые значения для этого параметра? Из справочной страницы Red Hat:

Это шестнадцатеричная маска без начального '0x', в системах с большим числом процессоров каждая группа из восьми шестнадцатеричных цифр отделяется запятой ','. т.е. export IRQBALANCE_BANNED_CPUS=fc0 будет препятствовать назначению irqbalance для 7-го и 12-го процессоров (cpu6-cpu11) или export IRQBALANCE_BANNED_CPUS=ff000000,00000001 будет препятствовать назначению irqbalance irqs для 1-го (cpu0) и 57-го-64-го процессоров (cpu56-cpu63).

Понятие маски объясняется в википедии. Прочитайте это, затем возвращайтесь. Давайте разберем первый пример Red Hat. Число, записанное в шестнадцатеричном формате как fc0, записывается в двоичном виде как 111111000000. Сканирование справа налево (т. Е. От младшего значащего бита к старшему значащему) дает шесть нулей. Это означает, что 1-5-му процессору (cpu0-cpu5) можно назначать прерывания. Тогда есть шесть. Это означает, что 7–12-му процессору (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

Ошибка irqbalance не позволяет IRQBALANCE_BANNED_CPUS работать с обработками NUMA: http://code.google.com/p/irqbalance/issues/detail?id=43

На данный момент 1.0.5 является последней версией irqbalance и не имеет исправления.

Вы должны использовать 3c, как указано выше, чтобы он работал. Более поздние версии делают это автоматически (по крайней мере, v 1.9 в debian/sid)

В дополнение к приведенным выше предложениям по устранению неполадок, связанных с несоответствиями, - полезная команда для просмотра сходств прерываний, возникающих в результате запуска irqbalance:

find /proc/irq/ -name smp_affinity | xargs cat | less
Другие вопросы по тегам