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

9

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

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

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

РЕДАКТИРОВАТЬ1: Как узнать, что моя конфигурация действует, другими словами, что мой процессор не получает прерываний? Я проверяю / 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 и никаких других процессорах.

TraderJoeChicago
источник

Ответы:

7

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

Это шестнадцатеричная маска без начального '0x', в системах с большим числом процессоров каждая группа из восьми шестнадцатеричных цифр отделяется запятой ','. то есть export IRQBALANCE_BANNED_CPUS=fc0будет препятствовать назначению irqbalance irq для 7-го и 12-го процессоров (cpu6-cpu11) или export IRQBALANCE_BANNED_CPUS=ff000000,00000001запретит irqbalance назначать irq для 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
Sciurus
источник
Спасибо за объяснение. Путаница здесь: BAN CPU 0 на 6-процессорной машине. Я использую: 000001 (1) или 111110 (3e). Это первое, верно?
TraderJoeChicago
Пожалуйста, проверьте мои изменения в оригинальном вопросе. Мне нужно знать, как читать / proc / interrupts, чтобы убедиться, что моя конфигурация работает и мой процессор заблокирован от прерываний. Спасибо!
TraderJoeChicago
Посмотрите мой номер редактирования 3: IRQBALANCE_BANNED_CPUS вводится в Ubuntu, если только мы не испортим маску. Но я попробовал 1 и 3е безуспешно. :(
TraderJoeChicago
Смотрите мои исправления ошибок.
sciurus
2
НЕТ. Я могу подтвердить, что это не работает на Ubuntu 10.04.1. Этот параметр конфигурации IRQBALANCE_BANNED_CPUS = "1" игнорируется.
TraderJoeChicago
0

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

скоро
источник
0

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

find /proc/irq/ -name smp_affinity | xargs cat | less
YitzikC
источник