¿Cómo prohibir las interrupciones de hardware con IRQBALANCE_BANNED_CPUS en Ubuntu?

9

Me gustaría prohibir las interrupciones de ciertas CPU. Escuché sobre la opción IRQBALANCE_BANNED_CPUS. Veo que irqbalance se está ejecutando en el fondo de mi máquina. ¿Dónde voy a editar y cómo configuro esa opción? Por ejemplo, quiero excluir cpus 2,3,4,5 de las interrupciones. El descriptor de argumento es:

Proporciona una máscara de cpus que irqbalance debe ignorar y nunca asignar interrupciones a

¿Qué significa una máscara? ¿Y dónde configuro irqbalance con esa opción?

EDIT1: ¿Cómo saber que mi configuración está vigente, en otras palabras, que mi CPU no recibe interrupciones? Estoy comprobando / proc / interrupciones pero algunos números están aumentando allí.

EDIT2: ahora inicié mi máquina con IRQBALANCE_BANNED_CPUS = 3e, por lo que solo la CPU 0 NO tiene prohibidas las interrupciones. Así que debería esperar ver a cpo0 recibiendo muchas interrupciones y el otro cpus no recibiendo interrupciones, ¿verdad? Aquí está mi / proc / interrupciones. Las líneas en negrita están cambiando para TODOS los cpus. Las líneas 22, 24, 35 y LOC están cambiando.

            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

EDITAR3: Parece que la opción IRQBALANCE_BANNED_CPUS está completamente IGNORADA en Ubuntu . Intenté reiniciar mi máquina con 1, 3e y obtuve interrupciones por todas partes. Justo cuando desactivo irqbalance configurando ENABLED = 0, obtengo un clean / proc / interrupts solo en cpu0 y ninguna otra cpu.

TraderJoeChicago
fuente

Respuestas:

7

Configura IRQBALANCE_BANNED_CPUS en / etc / default / irqbalance . Encontré esto buscando en /etc/init.d/irqbalance . ¿Pero cuáles son los valores válidos para esa configuración? Desde la página de manual de Red Hat:

Esta es una máscara hexadecimal sin el '0x' principal, en sistemas con un gran número de procesadores, cada grupo de ocho dígitos hexadecimales se separa con una coma ','. es decir export IRQBALANCE_BANNED_CPUS=fc0, evitaría que irqbalance asigne irqs al 7º-12º cpus (cpu6-cpu11) o export IRQBALANCE_BANNED_CPUS=ff000000,00000001evitaría que irqbalance asigne irqs al 1º (cpu0) y 57º - 64º cpus (cpu56-cpu63).

El concepto de máscara se explica en wikipedia. Lee eso, luego vuelve. Analicemos el primer ejemplo de Red Hat. El número que se escribe como fc0 en hexadecimal se escribe como 111111000000 en binario. Escaneado de derecha a izquierda (es decir, desde el bit menos significativo al bit más significativo ), hay seis ceros. Esto significa que se pueden asignar interrupciones a los cpus 1º a 5º (cpu0-cpu5). Entonces, hay seis unos. Esto significa que no se asignarán interrupciones al cpus 7º-12º (cpu6-cpu11).

Parece que desea permitir que cpu0 y cpu1 reciban interrupciones, pero evite que se asignen interrupciones a cpu2, cpu3, ​​cpu4 y cpu5. Eso significa que necesita dos ceros y cuatro unos, o 111100. Esto es 3C en hexadecimal. Entonces, crearías / etc / default / irqbalance con los contenidos

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

Para ver qué está pasando, intente

$ sudo service irqbalance stop
Stopping SMP IRQ Balancer: irqbalance.
$ source /etc/default/irqbalance 
$ sudo irqbalance --debug
Sciurus
fuente
Gracias por la explicación. La confusión aquí es: PROHIBIR la CPU 0 en una máquina de 6 CPU. ¿Utilizo: 000001 (1) o 111110 (3e). Es el primero, ¿verdad?
TraderJoeChicago
Por favor revise mi edición en la pregunta original. Necesito saber cómo leer / proc / interrupciones para asegurarme de que mi configuración funciona y que mi CPU no tiene interrupciones. ¡Gracias!
TraderJoeChicago
Vea mi edición número 3: IRQBALANCE_BANNED_CPUS se está introduciendo en Ubuntu, a menos que estemos estropeando la máscara. Pero probé 1 y 3e sin ningún éxito. :(
TraderJoeChicago
Ver mis ediciones de depuración.
sciurus
2
NO. Puedo confirmar que NO funciona en Ubuntu 10.04.1. Esta opción de configuración IRQBALANCE_BANNED_CPUS = "1" se ignora.
TraderJoeChicago
0

Tienes que usar 3c según lo anterior para que funcione. Las versiones posteriores hacen esto automáticamente (al menos en v 1.9 en debian / sid)

luego
fuente
0

Agregando a las sugerencias anteriores sobre la resolución de problemas de irqbalance: un comando útil para ver las afinidades de interrupción resultantes de la ejecución de irqbalance:

find /proc/irq/ -name smp_affinity | xargs cat | less
YitzikC
fuente