Como banir interrupções de hardware com IRQBALANCE_BANNED_CPUS no Ubuntu?

9

Eu gostaria de banir interrupções de certas CPUs. Eu ouvi sobre a opção IRQBALANCE_BANNED_CPUS. Vejo que o irqbalance está sendo executado no fundo da minha máquina. Onde vou editar e como configuro essa opção? Por exemplo, quero excluir o cpus 2,3,4,5 das interrupções. O descritor de argumento é:

Fornece uma máscara de cpus que o irqbalance deve ignorar e nunca atribui interrupções a

O que significa uma máscara? E onde eu configuro o irqbalance com essa opção?

EDIT1: Como saber que minha configuração está em vigor, em outras palavras, que minha CPU está recebendo interrupções NO? Estou verificando / proc / interrompe, mas alguns números estão aumentando lá.

EDIT2: Agora eu inicializei minha máquina com IRQBALANCE_BANNED_CPUS = 3e, portanto, apenas a CPU 0 NÃO é banida de interrupções. Então, eu deveria esperar ver cpo0 recebendo muitas interrupções e os outros cpus não recebendo interrupções, certo? Aqui está o meu / proc / interrompe. As linhas em negrito estão mudando para TODOS os cpus. As linhas 22, 24, 35 e LOC estão mudando.

            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: Parece que a opção IRQBALANCE_BANNED_CPUS está completamente IGNORADA no Ubuntu . Tentei reiniciar minha máquina com 1, 3e e tive interrupções por todo o lado. Apenas quando desabilito o irqbalance, definindo ENABLED = 0, recebo uma limpeza / proc / interrompe apenas na CPU0 e em nenhuma outra CPU.

TraderJoeChicago
fonte

Respostas:

7

Você define IRQBALANCE_BANNED_CPUS em / etc / default / irqbalance . Encontrei isso consultando /etc/init.d/irqbalance . Mas quais são os valores válidos para essa configuração? Na página de manual da Red Hat:

Esta é uma máscara hexadecimal sem o '0x' inicial, em sistemas com grande número de processadores, cada grupo de oito dígitos hexadecimais é separado por vírgula ','. isto export IRQBALANCE_BANNED_CPUS=fc0impediria o irqbalance de atribuir irqs ao 7º-12º cpus (cpu6-cpu11) ou export IRQBALANCE_BANNED_CPUS=ff000000,00000001impediria que o irqbalance atribuísse irqs ao 1º (cpu0) e 57º a 64º cpus (cpu56-cpu63).

O conceito de uma máscara é explicado na Wikipedia. Leia isso e depois volte. Vamos detalhar o primeiro exemplo da Red Hat. O número que é escrito como fc0 em hexadecimal é escrito como 111111000000 em binário. Digitalizando da direita para a esquerda (ou seja, do bit menos significativo para o bit mais significativo ), existem seis zeros. Isso significa que o 1º ao 5º cpus (cpu0-cpu5) pode ser atribuído a interrupções. Então, existem seis. Isso significa que o 7º-12º cpus (cpu6-cpu11) não receberá interrupções.

Parece que você deseja permitir que cpu0 e cpu1 recebam interrupções, mas evita que cpu2, cpu3, ​​cpu4 e cpu5 recebam interrupções. Isso significa que você precisa de dois zeros e quatro, ou 111100. Isso é 3C em hexadecimal. Então, você criaria / etc / default / irqbalance com o conteúdo

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

Para ver o que está acontecendo, tente

$ sudo service irqbalance stop
Stopping SMP IRQ Balancer: irqbalance.
$ source /etc/default/irqbalance 
$ sudo irqbalance --debug
sciurus
fonte
Obrigada pelo esclarecimento. A confusão aqui é: Proibir CPU 0 em uma máquina de 6 cpu. Eu uso: 000001 (1) ou 111110 (3e). É o primeiro, certo?
TraderJoeChicago 19/04/12
Por favor, verifique minha edição na pergunta original. Preciso saber como ler / proc / interrupções para garantir que minha configuração esteja funcionando e que minha CPU esteja proibida de interrupções. Obrigado!
TraderJoeChicago 19/04/12
Veja minha edição número 3: IRQBALANCE_BANNED_CPUS está sendo usado no Ubuntu, a menos que esteja atrapalhando a máscara. Mas eu tentei 1 e 3e sem sucesso. :(
TraderJoeChicago 19/04/12
Veja minhas edições de depuração.
sciurus
2
NÃO. Posso confirmar que NÃO funciona no Ubuntu 10.04.1. Esta opção de configuração IRQBALANCE_BANNED_CPUS = "1" é ignorada.
TraderJoeChicago
2

um erro do irqbalance impede o IRQBALANCE_BANNED_CPUS de trabalhar em machinges NUMA: http://code.google.com/p/irqbalance/issues/detail?id=43

A partir de agora, a 1.0.5 é a versão mais recente do irqbalance e não possui a correção.

carrilhão
fonte
0

Você tem que usar 3c como acima para fazê-lo funcionar. Versões posteriores fazem isso automaticamente (pelo menos na versão 1.9 no debian / sid)

anon
fonte
0

Adicionando às sugestões acima sobre solução de problemas do irqbalance - Um comando útil para visualizar as afinidades de interrupção resultantes da execução do irqbalance:

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