우분투에서 IRQBALANCE_BANNED_CPUS로 하드웨어 인터럽트를 금지하는 방법은 무엇입니까?


9

특정 CPU의 인터럽트를 금지하고 싶습니다. IRQBALANCE_BANNED_CPUS 옵션에 대해 들었습니다. 기계의 백그라운드에서 irqbalance가 실행되고있는 것을 볼 수 있습니다. 어디에서 편집으로 이동하고 해당 옵션을 어떻게 구성합니까? 예를 들어, cpus 2,3,4,5를 인터럽트에서 제외하고 싶습니다. 인수 디스크립터 는 다음과 같습니다.

irqbalance가 무시하고 인터럽트를 할당해서는 안되는 CPU 마스크를 제공합니다.

마스크 란 무엇을 의미합니까? 그리고 그 옵션으로 irqbalance를 어디에 구성합니까?

EDIT1 : 내 구성이 적용되는지 확인하는 방법, 즉 내 CPU가 인터럽트를받지 않는다는 것을 어떻게 알 수 있습니까? / proc / interrupts를 확인하고 있지만 일부 숫자가 증가하고 있습니다.

EDIT2 : 이제 IRQBALANCE_BANNED_CPUS = 3e로 내 컴퓨터를 부팅 했으므로 CPU 0 만 인터럽트에서 금지되지 않았습니다. 그래서 cpo0이 많은 인터럽트를 수신하고 다른 cpus가 인터럽트를 수신하지 않는 것을 볼 수 있어야합니다. 여기 내 / proc / interrupts가 있습니다. 굵은 선은 모든 CPU에 대해 변경됩니다. 22, 24, 35 행과 LOC가 변경됩니다.

            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 : 우분투에서 IRQBALANCE_BANNED_CPUS 옵션이 완전히 무시 된 것처럼 보입니다 . 나는 1, 3e로 내 컴퓨터를 재부팅하려고 시도했으며 모든 인터럽트가 발생했습니다. ENABLED = 0을 설정하여 irqbalance를 비활성화하면 cpu0에서만 깨끗한 / proc / interrupts가 발생하고 다른 CPU는 없습니다.

답변:


7

/ etc / default / irqbalance에 IRQBALANCE_BANNED_CPUS를 설정했습니다 . 나는 이것을 /etc/init.d/irqbalance 에서 찾아 보았습니다 . 그러나 해당 설정에 유효한 값은 무엇입니까? Red Hat 매뉴얼 페이지에서 :

이는 프로세서 수가 많은 시스템에서 선행 '0x'가없는 16 진 마스크입니다. 각 8 개의 16 진 숫자 그룹은 쉼표 ','로 구분됩니다. 즉, export IRQBALANCE_BANNED_CPUS=fc0irqbalance가 irq를 7-12 번째 cpu (cpu6-cpu11)에 export IRQBALANCE_BANNED_CPUS=ff000000,00000001할당하지 못하게 하거나 irqbalance가 irq를 1st (cpu0) 및 57-64 번째 cpus (cpu56-cpu63)에 할당하지 못하게합니다.

마스크개념은 Wikipedia에 설명되어 있습니다. 그것을 읽고 나서 돌아 오십시오. Red Hat의 첫 번째 예를 살펴 보겠습니다. 16 진수로 fc0으로 쓰여진 숫자는 2 진수로 111111000000으로 쓰여집니다. 오른쪽에서 왼쪽으로 스캔하면 (즉, 최하위 비트 에서 최상위 비트로 ) 6 개의 0이 있습니다. 이는 1-5 번째 CPU (cpu0-cpu5)에 인터럽트를 할당 할 수 있음을 의미합니다. 그리고 6 개가 있습니다. 이는 7-12 번째 CPU (cpu6-cpu11)에 인터럽트가 할당되지 않음을 의미합니다.

cpu0 및 cpu1이 인터럽트를 수신하도록 허용하지만 cpu2, cpu3, ​​cpu4 및 cpu5에 인터럽트가 할당되지 않도록하려는 것 같습니다. 즉, 두 개의 0과 네 개의 1 또는 111100이 필요합니다. 이것은 16 진수로 3C입니다. 따라서 내용 으로 / etc / default / irqbalance 를 만듭니다.

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

무슨 일이 일어나고 있는지 확인하려면

$ sudo service irqbalance stop
Stopping SMP IRQ Balancer: irqbalance.
$ source /etc/default/irqbalance 
$ sudo irqbalance --debug

설명 주셔서 감사합니다. 혼동은 6 CPU 시스템에서 BAN CPU 0에 대한 것입니다. 000001 (1) 또는 111110 (3e)를 사용하십시오. 처음 이지요?
TraderJoeChicago

원래 질문에서 편집 한 내용을 확인하십시오. / proc / interrupts를 읽고 구성이 작동하고 CPU가 인터럽트되지 않도록하는 방법을 알아야합니다. 감사!
TraderJoeChicago

편집 번호 3 참조 : 마스크를 엉망으로 만들지 않는 한 IRQBALANCE_BANNED_CPUS가 우분투에 도입되었습니다. 그러나 나는 성공하지 않고 1과 3e를 시도했습니다. :(
TraderJoeChicago

내 디버깅 편집을 참조하십시오.
sciurus

2
아니. Ubuntu 10.04.1에서 작동하지 않는 것을 확인할 수 있습니다. 이 구성 옵션 IRQBALANCE_BANNED_CPUS = "1"은 무시됩니다.
TraderJoeChicago


0

위와 같이 3c를 사용해야 작동합니다. 이후 버전에서는 자동으로 수행합니다 (debian / sid에서 v 1.9 이상).


0

irqbalance 문제 해결에 대한 위의 제안에 추가-irqbalance 실행으로 인한 인터럽트 친화도를 보는 유용한 명령 :

find /proc/irq/ -name smp_affinity | xargs cat | less
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.