인터럽트 smp_affinity 변경

인터럽트 smp_affinity 변경

아래에 표시된 것처럼 nvidia는 인터럽트를 공유하고 인터럽트는 CPU0만 사용합니다. nvidia의 인터럽트를 변경하고 두 CPU를 모두 사용하도록 하려면 어떻게 해야 합니까?
여기두 번째 문제를 설명하는 기사입니다. smp_affinity를 수정하여 CPU0과 CPU1 사이를 변경할 수 있지만 두 CPU를 모두 사용하도록 설정하는 방법을 이해하지 못합니다.

~에 따르면이것블로그 smp_affinity를 3으로 설정하면 CPU0과 CPU1을 모두 사용해야 합니다. 실제로 제 경우에는 CPU0을 사용합니다(1로 설정된 것처럼 작동합니다). CPU1을 사용하려면 2로 설정하세요.

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

감사해요.

편집하다: 나는 내 Linux 박스에서 HD 영화(최소 720편)를 재생하려고 합니다. 나는 nvidia 66xx 시리즈, Linux 버전 Ubuntu 11.04를 가지고 있고 nvidia 독점 드라이버를 설치했지만 이전 하드웨어(8xxx 시리즈 이상만)에 대한 하드웨어 가속(및 비디오 디코딩)을 지원하지 않으므로 디코딩은 소프트웨어에서 수행됩니다. HD 영화를 시청하려고 하면 이미지가 몇 초 동안 정지되었다가 몇 초 동안 작동했다가 다시 정지됩니다. CPU 사용량이 내 관심을 끌었고 nvidia 드라이버는 하나의 CPU만 사용하므로 nvidia가 두 개의 CPU를 사용하도록 할 수 있다면 아마도 더 나은 성능을 얻을 수 있고 결국 내 Linux 박스 영화에서 HD를 볼 수 있을 것이라고 생각했습니다. 그런데 저는 가능한 모든 Linux 플레이어를 사용해 보았습니다: mplayer(야간 빌드도 포함), 토템, vlc 등...

편집하다: 인터럽트 밸런싱 - 디버깅

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) 

답변1

당신은 잘못된 나무를 가지고 있습니다. 두 CPU가 모두 인터럽트를 수신하면 성능이 좋아지는 것이 아니라 나빠집니다. 한편으로 이는 소프트웨어 디코더가 지속적으로 중단되고 있음을 의미합니다. 반면에 이는 인터럽트 코드가 캐시에서 핫할 가능성이 적다는 것을 의미합니다. 상황이 더 악화되는 데에는 다른 많은 이유가 있습니다.

답변2

본 적 있나요?인터럽트 밸런스? 하고 싶은 일이 해결될 것 같습니다. Irqbalance는 캐시와 동시에 실행되는 코어 수도 고려합니다.문서, 이는 /proc 항목을 수정하여 달성할 수 없습니다.

(나는 귀하의 문제가 전적으로 인터럽트 공유 부족으로 인한 것이라고 생각하지 않습니다. 몇 초 동안 일시 중지하면 디스크 또는 기타 성능 문제처럼 들리기 때문입니다.)

관련 정보