Jak zakazać przerwań sprzętowych za pomocą IRQBALANCE_BANNED_CPUS na Ubuntu?

9

Chciałbym zakazać przerwań niektórych procesorów. Słyszałem o opcji IRQBALANCE_BANNED_CPUS. Widzę, że w tle mojej maszyny działa nierównowaga. Gdzie mogę edytować i jak skonfigurować tę opcję? Na przykład chcę wykluczyć cpus 2,3,4,5 z przerwań. Deskryptor argumentu to:

Zapewnia maskę cpus, którą nierównowaga powinna ignorować i nigdy nie przypisywać przerwaniom

Co to znaczy maska? A gdzie mam skonfigurować nierównowagę za pomocą tej opcji?

EDYCJA 1: Jak wiedzieć, że moja konfiguracja obowiązuje, innymi słowy, że moja jednostka centralna nie odbiera żadnych przerwań? Sprawdzam / proc / przerywa, ale niektóre liczby tam rosną.

EDYCJA 2: Teraz uruchomiłem komputer za pomocą IRQBALANCE_BANNED_CPUS = 3e, więc tylko procesor 0 NIE jest blokowany przed przerwaniami. Więc powinienem spodziewać się, że cpo0 otrzyma wiele przerwań, a inne procesory nie otrzymają przerwań, prawda? Oto moje / proc / interrupts. Pogrubione linie zmieniają się dla WSZYSTKICH cpus. Linie 22, 24, 35 i LOC zmieniają się.

            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

EDYCJA 3: Wygląda na to, że opcja IRQBALANCE_BANNED_CPUS jest całkowicie Zignorowana na Ubuntu . Próbowałem zrestartować moją maszynę z 1, 3e i wszędzie pojawiały się przerwy. Właśnie kiedy wyłączam nierównowagę poprzez ustawienie ENABLED = 0, że dostaję czyste / proc / przerywa tylko na cpu0 i żadnych innych procesorach.

TraderJoeChicago
źródło

Odpowiedzi:

7

Ustawiasz IRQBALANCE_BANNED_CPUS w / etc / default / irqbalance . Znalazłem to, szukając w /etc/init.d/irqbalance . Ale jakie są prawidłowe wartości dla tego ustawienia? Ze strony man Red Hata:

Jest to maska ​​szesnastkowa bez wiodącego „0x”, w systemach z dużą liczbą procesorów każda grupa ośmiu cyfr szesnastkowych jest oddzielona przecinkiem, ”. tj. export IRQBALANCE_BANNED_CPUS=fc0zapobiegnie przypisywaniu irqs irqs do 7- cth cpus (cpu6-cpu11) lub export IRQBALANCE_BANNED_CPUS=ff000000,00000001przeszkodzi w przypisywaniu irqs do irqs do 1. (cpu0) i 57.-64 cpus (cpu56-cpu63).

Pojęcie maską zostało wyjaśnione na wikipedii. Przeczytaj to, a potem wróć. Przełammy pierwszy przykład Red Hata. Liczba zapisana jako fc0 w systemie szesnastkowym jest zapisywana jako 111111000000 w formacie binarnym. Skanując od prawej do lewej (tj. Od najmniej znaczącego bitu do najbardziej znaczącego bitu ), jest sześć zer. Oznacza to, że 1.-5. procesorowi (cpu0-cpu5) można przypisać przerwania. Następnie jest ich sześć. Oznacza to, że 7.-12. cpus (cpu6-cpu11) nie zostaną przypisane przerwania.

Wygląda na to, że chcesz zezwolić procesorom cpu0 i cpu1 na odbieranie przerwań, ale zapobiegać przypisywaniu przerwań cpu2, cpu3, ​​cpu4 i cpu5. Oznacza to, że potrzebujesz dwóch zer i czterech zer lub 111100. Jest to 3C w systemie szesnastkowym. Tak więc utworzyłbyś / etc / default / irqbalance z zawartością

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

Aby zobaczyć, co się dzieje, spróbuj

$ sudo service irqbalance stop
Stopping SMP IRQ Balancer: irqbalance.
$ source /etc/default/irqbalance 
$ sudo irqbalance --debug
Sciurus
źródło
Dziękuję za wyjaśnienie. Problem w tym, że: BAN CPU 0 na maszynie 6-procesorowej. Czy używam: 000001 (1) czy 111110 (3e). To pierwszy, prawda?
TraderJoeChicago,
Proszę sprawdzić moją edycję w pierwotnym pytaniu. Muszę wiedzieć, jak czytać / proc / interrupts, aby upewnić się, że moja konfiguracja działa, a moja jednostka centralna jest zablokowana przed przerwaniami. Dzięki!
TraderJoeChicago
Zobacz mój numer edycji 3: IRQBALANCE_BANNED_CPUS jest zapisywany na Ubuntu, chyba że zepsujemy maskę. Ale próbowałem 1 i 3e bez powodzenia. :(
TraderJoeChicago
Zobacz moje zmiany debugowania.
sciurus
2
NIE. Mogę potwierdzić, że NIE działa na Ubuntu 10.04.1. Ta opcja konfiguracji IRQBALANCE_BANNED_CPUS = „1” jest ignorowana.
TraderJoeChicago,
0

Musisz użyć 3c jak wyżej, aby to działało. Późniejsze wersje robią to automatycznie (przynajmniej w wersji 1.9 na debian / sid)

zaraz
źródło
0

Dodanie do powyższych sugestii dotyczących rozwiązywania problemów z nierównowagą - Przydatne polecenie do przeglądania powinowactwa przerwań wynikających z przebiegu nierównowagi:

find /proc/irq/ -name smp_affinity | xargs cat | less
YitzikC
źródło