4.3. 인터럽트 및 IRQ 튜닝

인터럽트 요청 (IRQ)은 하드웨어 레벨에서 전송되는 서비스에 대한 요청입니다. 인터럽트는 전용 하드웨어 라인이나 정보 패킷 (메시지 인터럽트 신호 또는 MSI)과 같은 하드웨어 버스를 통해 전송될 수 있습니다.
인터럽트가 활성화되면 IRQ 수신은 인터럽트 컨텍스트로의 전환을 묻는 메세지를 표시합니다. 커널 인터럽트 디스패치 코드는 IRQ 번호와 관련된 등록된 ISR (Interrupt Service Routines)의 목록을 검색하고 각 ISR을 차례로 호출합니다. ISR은 인터럽트를 승인하고 동일한 ISR에서 중복 인터럽트를 무시한 후 인터럽트 처리 완료 및 향후 인터럽트 무시에서 ISR을 중지시키기 위해 보류 처리기를 대기열에 넣습니다.
/proc/interrupts 파일은 I/O 장치 당 CPU 당 인터럽트 수를 나열합니다. 이는 IRQ 번호, 각 CPU 코어에 의해 처리되는 인터럽트 수, 인터럽트 유형, 인터럽트를 수신하도록 등록된 콤마로 구분된 드라이버 목록을 표시합니다. (보다 자세한 내용은 man 5 proc proc(5) man 페이지에서 참조하십시오.
IRQ에는 관련 "친화도" 속성 smp_affinity가 있어 해당 IRQ의 ISR 실행을 허용하는 CPU 코어를 정의합니다. 이러한 속성은 하나 이상의 특정 CPU 코어에 인터럽트 친화도 및 애플리케이션의 스레드 친화도를 할당하여 애플리케이션의 성능을 향상시키는데 사용될 수 있습니다. 이를 통해 지정된 인터럽트와 애플리케이션 스레드 간의 캐시 라인을 공유할 수 있습니다.
특정 IRQ 번호의 인터럽트 친화도 값은 관련 /proc/irq/IRQ_NUMBER/smp_affinity 파일에 저장되어 있으며 이는 root 사용자로 수정 및 확인할 수 있습니다. 이 파일에 저장된 값은 시스템에 있는 모든 CPU 코어를 나타내는 16 진수 비트 마스크입니다.
예를 들어 네 개의 CPU 코어를 갖는 서버 상의 이더넷 드라이버에 대한 인터럽트 친화도를 설정하려면 이더넷 드라이버와 관련된 IRQ 번호를 지정해야 합니다:
# grep eth0 /proc/interrupts
32:   0     140      45       850264      PCI-MSI-edge      eth0
해당 smp_affinity 파일을 배치하려면 IRQ 번호를 사용합니다:
# cat /proc/irq/32/smp_affinity 
f
smp_affinity의 기본값인 f는 IRQ가 시스템에 있는 모든 CPU에서 서비스할 수 있다는 것을 의미합니다. 다음과 같이 이 값을 1로 설정하면 CPU 0 만이 이 인터럽트를 서비스할 수 있다는 것을 의미합니다:
# echo 1 >/proc/irq/32/smp_affinity
# cat /proc/irq/32/smp_affinity
1
콤마를 사용하여 분리된 32 비트 그룹의 smp_affinity 값을 구분하는데 사용할 수 있습니다. 이는 32 개 이상의 코어를 갖는 시스템에 필요합니다. 예를 들어 다음의 예에서는 IRQ 40이 64 코어 시스템의 모든 코어에서 서비스되는 것을 보여줍니다:
# cat /proc/irq/40/smp_affinity
ffffffff,ffffffff
64 코어 시스템의 상위 32 코어에 있는 IRQ 40을 서비스하려면 다음을 수행해야 합니다:
# echo 0xffffffff,00000000 > /proc/irq/40/smp_affinity
# cat /proc/irq/40/smp_affinity
ffffffff,00000000

참고

인터럽트 스티어링을 지원하는 시스템에서 IRQ의 smp_affinity를 수정하여 하드웨어를 설정하고 인터럽트를 특정 CPU에서 실행하는 결정을 커널에서의 간섭없이 하드웨어 수준에서 수행할 수 있습니다.

Red Hat의 최신 제품 문서 번역을 신속하게 제공하기 위해 이 페이지에는 영어 원본을 한국어로 자동 번역한 내용이 포함되어 있을 수 있습니다. [자세한 내용보기]