muda a interrupção smp_affinity

4

Como você pode ver abaixo, a nvidia está compartilhando a intrerrupt e a interrupção está usando apenas o CPU0, como posso alterar a interrupção para a nvidia e como posso fazer com que ela use ambas as CPUs?
Aqui é um artigo descrevendo a segunda pergunta, eu posso mudar entre CPU0 e CPU1 modificando smp_affinity, mas não entendi como posso configurá-lo para usar as duas CPUs.

De acordo com este blog definindo smp_affinity para 3 deve usar tanto CPU0 quanto CPU1. Na verdade, no meu caso, ele usa CPU0 (se comportando como se estivesse definido como 1). Configurando para 2 usa CPU1.

radu@radu-work:~$ cat /proc/interrupts
           CPU0       CPU1       
  0:         79          0   IO-APIC-edge      timer
  1:          9      17152   IO-APIC-edge      i8042
  4:          2          0   IO-APIC-edge    
  6:          5          0   IO-APIC-edge      floppy
  7:          0          0   IO-APIC-edge      parport0
  8:          1          0   IO-APIC-edge      rtc0
  9:          0          0   IO-APIC-fasteoi   acpi
 12:     694613          0   IO-APIC-edge      i8042
 16:    1233922          0   IO-APIC-fasteoi   uhci_hcd:usb3, ahci, nvidia
 17:       3961     168757   IO-APIC-fasteoi   uhci_hcd:usb4, pata_jmicron
 18:          0          0   IO-APIC-fasteoi   ehci_hcd:usb1, uhci_hcd:usb7
 19:         59          0   IO-APIC-fasteoi   ata_piix, ata_piix, uhci_hcd:usb6
 22:        819       6915   IO-APIC-fasteoi   HDA Intel
 23:          2          0   IO-APIC-fasteoi   ehci_hcd:usb2, uhci_hcd:usb5, eth


radu@radu-work:~$ sudo cat /proc/irq/16/smp_affinity 
1

root@radu-work:~# uname -a
Linux radu-work 2.6.32-32-generic #62-Ubuntu SMP Wed Apr 20 21:54:21 UTC 2011 i686 GNU/Linux

Obrigado.

EDITAR: Estou tentando fazer com que minha caixa do Linux reproduza filmes HD (pelo menos 720). Eu tenho uma série nvidia 66xx, versão Linux Ubuntu 11.04, eu tenho drivers nvidia proprietários instalados, mas eles não suportam aceleração de hardware (e decodificação de vídeo) para harware antigo (apenas 8xxx series e acima) para que a decodificação seja feita em software. Quando tento ver um filme em HD, a imagem fica congelada por alguns segundos, funciona alguns segundos e depois se esfria novamente. O uso da CPU atraiu minha atenção, os drivers nvidia estavam usando apenas um processador, então acredito que se eu puder fazer a nvidia usar ambos os processadores talvez eu tenha um desempenho melhor, e possa finalmente assistir filmes em HD na minha caixa Linux. A propósito, tentei todos os possíveis leitores de Linux: o mplayer (até mesmo construções noturnas), totem, vlc e muito mais ...

EDITAR: irqbalance --debug

root@radu-work:/# irqbalance --debug
Package 0:  cpu mask is 00000001 (workload 0)
        Cache domain 0: cpu mask is 00000001  (workload 0) 
                CPU number 0  (workload 0)
                CPU number 0  (workload 0)
Package 0:  cpu mask is 00000003 (workload 0)
        Cache domain 0: cpu mask is 00000003  (workload 0) 
                CPU number 0  (workload 0)
                CPU number 1  (workload 0)
Interrupt 44 (class ethernet) has workload 7 
Interrupt 0 (class timer) has workload 0 
Interrupt 16 (class storage) has workload 122 
Interrupt 17 (class storage) has workload 29 
Interrupt 19 (class storage) has workload 0 
Interrupt 45 (class legacy) has workload 2 
Interrupt 1 (class legacy) has workload 2 
Interrupt 12 (class legacy) has workload 0 
-----------------------------------------------------------------------------
IRQ delta is 152640 
Rescanning cpu topology 
Package 0:  cpu mask is 00000001 (workload 0)
        Cache domain 0: cpu mask is 00000001  (workload 0) 
                CPU number 0  (workload 0)
                CPU number 0  (workload 0)
Package 0:  cpu mask is 00000003 (workload 0)
        Cache domain 0: cpu mask is 00000003  (workload 0) 
                CPU number 0  (workload 0)
                CPU number 1  (workload 0)
Package 0:  cpu mask is 00000001 (workload 16)
        Cache domain 0: cpu mask is 00000001  (workload 16) 
                CPU number 0  (workload 3)
                  Interrupt 44 (ethernet/2) 
                CPU number 0  (workload 0)
          Interrupt 17 (storage/9) 
          Interrupt 19 (storage/0) 
          Interrupt 45 (legacy/0) 
          Interrupt 12 (legacy/0) 
Package 0:  cpu mask is 00000003 (workload 42)
        Cache domain 0: cpu mask is 00000003  (workload 42) 
                CPU number 0  (workload 0)
                CPU number 1  (workload 0)
          Interrupt 16 (storage/40) 
          Interrupt 1 (legacy/0) 

-----------------------------------------------------------------------------
...
-----------------------------------------------------------------------------
IRQ delta is 10 
IRQ delta is 10, switching to power mode 
Rescanning cpu topology 
Package 0:  cpu mask is 00000001 (workload 0)
        Cache domain 0: cpu mask is 00000001  (workload 0) 
                CPU number 0  (workload 0)
                CPU number 0  (workload 0)
Package 0:  cpu mask is 00000003 (workload 0)
        Cache domain 0: cpu mask is 00000003  (workload 0) 
                CPU number 0  (workload 0)
                CPU number 1  (workload 0)
Package 0:  cpu mask is 00000001 (workload 38)
        Cache domain 0: cpu mask is 00000001  (workload 38) 
                CPU number 0  (workload 36)
                  Interrupt 44 (ethernet/35) 
                CPU number 0  (workload 0)
          Interrupt 16 (storage/0) 
          Interrupt 1 (legacy/0) 
Package 0:  cpu mask is 00000003 (workload 4)
        Cache domain 0: cpu mask is 00000003  (workload 4) 
                CPU number 0  (workload 0)
                CPU number 1  (workload 0)
          Interrupt 19 (storage/0) 
          Interrupt 17 (storage/0) 
          Interrupt 45 (legacy/0) 
          Interrupt 12 (legacy/0) 
    
por Radu Maris 12.07.2011 / 14:08

2 respostas

1

Você está latindo na árvore errada. Ter as interrupções para ambas as CPUs faria o desempenho pior, não melhor. Por um lado, isso significaria que o decodificador de software seria constantemente interrompido. Por outro lado, isso significaria que o código de interrupção seria menos provável de ser quente no cache. Há muitas outras razões para isso piorar as coisas.

    
por 27.09.2011 / 10:47
0

Você já olhou para o equilíbrio ? Parece que isso vai resolver o que você está tentando fazer. O Irqbalance também leva em conta os caches, bem como quantos núcleos estão sendo executados por vez documentação , algo que modificar entradas / proc não alcançar.

(Eu não estou convencido de que o seu problema é estritamente devido à falta de interrupção de compartilhamento - como pausas de alguns segundos soam como problemas de desempenho com o disco, etc?).

    
por 27.08.2011 / 12:39