31.4. 인터럽트 요청 개요
인터럽트 요청 또는 IRQ는 하드웨어에서 프로세서로 전송되는 즉시 감시를 위한 신호입니다. 시스템의 각 장치에는 고유한 인터럽트를 보낼 수 있는 하나 이상의 IRQ 번호가 할당됩니다. 인터럽트가 활성화되면 인터럽트 요청을 수신하는 프로세서는 인터럽트 요청을 처리하기 위해 현재 애플리케이션 스레드의 실행을 즉시 일시 중지합니다.
인터럽트가 정상적인 작업을 중지하므로 높은 인터럽트 속도가 시스템 성능을 심각하게 저하시킬 수 있습니다. 인터럽트 선호도를 구성하거나 우선 순위가 낮은 인터럽트를 배치(여러 인터럽트 결합)로 전송하여 인터럽트에서 수행하는 시간을 줄일 수 있습니다.
인터럽트 요청에는 인터럽트 요청을 처리하는 프로세서를 정의하는 관련 선호도 속성인 smp_affinity
가 있습니다. 애플리케이션 성능을 개선하기 위해 동일한 프로세서 또는 동일한 코어의 프로세서에 인터럽트 선호도 및 프로세스 선호도를 할당합니다. 이렇게 하면 지정된 인터럽트 및 애플리케이션 스레드가 캐시 행을 공유할 수 있습니다.
인터럽트를 지원하는 시스템에서 인터럽트 요청의 smp_affinity
속성을 수정하여 특정 프로세서와 함께 인터럽트를 서비스하기로 한 결정은 커널의 개입 없이 하드웨어 수준에서 이루어집니다.
31.4.1. 인터럽트 수동 분산
BIOS에서 NUMA 토폴로지를 내보내는 경우 irqbalance
서비스는 하드웨어 요청 서비스로 로컬인 노드에서 인터럽트 요청을 자동으로 제공할 수 있습니다.
절차
- 구성할 인터럽트 요청에 해당하는 장치를 확인합니다.
플랫폼에 맞는 하드웨어 사양을 찾아보십시오. 시스템의 칩셋이 인터럽트 배포를 지원하는지 확인합니다.
- 이 경우 다음 단계에 설명된 대로 인터럽트 전달을 구성할 수 있습니다. 또한 칩셋에서 인터럽트의 균형을 조정하는 데 사용하는 알고리즘을 확인합니다. 일부 BIOS에는 인터럽트 전달을 구성하는 옵션이 있습니다.
- 그렇지 않으면 칩셋은 항상 모든 인터럽트를 하나의 정적 CPU로 라우팅합니다. 사용되는 CPU는 구성할 수 없습니다.
시스템에서 사용 중인 고급 프로그래밍 가능한 인터럽트 컨트롤러 (APIC) 모드를 확인합니다.
$ journalctl --dmesg | grep APIC
여기,
-
시스템에서
flat 이외의 모드를 사용하는 경우
.물리적 플랫
으로 APIC 라우팅 설정과 유사한 행을 확인할 수 있습니다 이러한 메시지가 표시되지 않으면 시스템은
플랫
모드를 사용합니다.시스템이
x2apic
모드를 사용하는 경우부트 로더
구성의 커널 명령줄에nox2apic
옵션을 추가하여 비활성화할 수 있습니다.물리적이 아닌 플랫 모드(flat
)
만 여러 CPU에 인터럽트를 분산하는 기능을 지원합니다. 이 모드는 CPU가 최대8
개인 시스템에만 사용할 수 있습니다.
-
시스템에서
-
smp_affinity 마스크
를 계산합니다.smp_affinity mask
를 계산하는 방법에 대한 자세한 내용은 smp_affinity mask 설정을 참조하십시오.
추가 리소스
-
journalctl(1)
및taskset(1)
도움말 페이지
31.4.2. smp_affinity 마스크 설정
smp_affinity
값은 시스템의 모든 프로세서를 나타내는 16진수 비트 마스크로 저장됩니다. 각 비트는 다른 CPU를 구성합니다. 가장 적은 유효 비트는 CPU 0입니다.
마스크의 기본값은 f
입니다. 즉, 시스템의 모든 프로세서에서 인터럽트 요청을 처리할 수 있습니다. 이 값을 1로 설정하면 프로세서 0만 인터럽트를 처리할 수 있습니다.
절차
바이너리에서는 인터럽트를 처리하는 CPU에 대해 값 1을 사용합니다. 예를 들어 CPU 0 및 CPU 7을 인터럽트를 처리하도록 설정하려면 바이너리 코드로
0000000010000001
을 사용합니다.표 31.1. CPU의 바이너리 비트 CPU
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
바이너리
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
바이너리 코드를 16진수로 변환합니다.
예를 들어 Python을 사용하여 바이너리 코드를 변환하려면 다음을 수행합니다.
>>> hex(int('0000000010000001', 2)) '0x81'
32개 프로세서가 넘는 시스템에서는 개별 32비트 그룹의
smp_affinity
값을 구분해야 합니다. 예를 들어 64 프로세서 시스템의 처음 32 프로세서만 인터럽트 요청을 서비스하려면0xffffff,00000000
을 사용합니다.특정 인터럽트 요청의 인터럽트 선호도 값은 연결된
/proc/irq/irq_number/smp_affinity
파일에 저장됩니다. 이 파일에서smp_affinity
마스크를 설정합니다.# echo mask > /proc/irq/irq_number/smp_affinity
추가 리소스
-
journalctl(1)
,irqbalance(1)
및taskset(1)
도움말 페이지