29.4. 인터럽트 요청 개요

인터럽트 요청 또는 IRQ는 하드웨어에서 프로세서로 전송되는 즉각적인 주의를 위한 신호입니다. 시스템의 각 장치에는 고유한 인터럽트를 보낼 수 있는 IRQ 번호가 하나 이상 할당됩니다. 인터럽트가 활성화되면 인터럽트 요청을 수신하는 프로세서는 인터럽트 요청을 처리하기 위해 현재 애플리케이션 스레드의 실행을 즉시 일시 중지합니다.

인터럽트가 정상적인 작동을 중단하므로 인터럽트 비율이 심각하게 시스템 성능이 저하될 수 있습니다. 인터럽트 선호도를 설정하거나 일괄 처리에서 여러 우선 순위 인터럽트를 전송하여 인터럽트에서 걸리는 시간을 줄일 수 있습니다(마운트 인터럽트 수 참조).

인터럽트 요청에는 인터럽트 요청을 처리하는 프로세서를 정의하는 smp_affinity 속성 smp_affinity이 있습니다. 애플리케이션 성능을 개선하기 위해 인터럽트 선호도 및 프로세스 선호도를 동일한 프로세서 또는 동일한 코어의 프로세서에 할당합니다. 이렇게 하면 지정된 인터럽트 및 애플리케이션 스레드가 캐시 라인을 공유할 수 있습니다.

인터럽트 steering을 지원하는 시스템에서는 인터럽트 요청의 smp_affinity 속성을 수정하여 하드웨어가 설정되므로 특정 프로세서를 통한 중단을 위한 결정이 커널에서 개입하지 않고 하드웨어 수준에서 이루어집니다.

29.4.1. 인터럽트 수동 밸런싱

BIOS가 NUMA 토폴로지를 내보내는 경우 irqbalance 서비스는 하드웨어 요청 서비스에 로컬인 노드의 인터럽트 요청을 자동으로 제공할 수 있습니다.

절차

  1. 구성할 인터럽트 요청에 해당하는 장치를 확인합니다.
  2. 플랫폼의 하드웨어 사양을 찾으십시오. 시스템의 칩셋이 인터럽트 배포를 지원하는지 확인합니다.

    1. 이 경우 다음 단계에 설명된 대로 인터럽트 전달을 구성할 수 있습니다. 또한 칩셋에서 인터럽트의 균형을 조정하는 데 사용하는 알고리즘을 확인합니다. 일부 BIOS에는 인터럽트 전달을 구성하는 옵션이 있습니다.
    2. 그렇지 않은 경우 칩셋은 모든 인터럽트를 항상 하나의 정적 CPU로 라우팅합니다. 사용되는 CPU를 구성할 수 없습니다.
  3. 시스템에서 사용 중인 APIC(Advanced Programmable Interrupt Controller) 모드를 확인합니다.

    $ journalctl --dmesg | grep APIC

    여기,

    • 시스템에서 플랫 이외의 모드를 사용하는 경우 물리적 플랫 으로 APIC 라우팅 설정 과 유사한 행이 표시될 수 있습니다.
    • 이러한 메시지가 표시되지 않으면 시스템은 플랫 모드를 사용합니다.

      시스템이 x2apic 모드를 사용하는 경우 부트 로더 설정의 커널 명령줄에 nox2apic 옵션을 추가하여 이를 비활성화할 수 있습니다.

      플랫(물리적 플랫 모드)만 인터럽트를 여러 CPU에 배포할 수 있도록 지원합니다. 이 모드는 CPU가 8 개까지 있는 시스템에만 사용할 수 있습니다.

  4. smp_affinity mask 를 계산합니다. smp_affinity mask 를 계산하는 방법에 대한 자세한 내용은 smp_affinity mask 설정을 참조하십시오.

추가 리소스

  • journalctl(1)taskset(1) 도움말 페이지

29.4.2. smp_affinity mask 설정

smp_affinity 값은 시스템의 모든 프로세서를 나타내는 16진수 비트 마스크로 저장됩니다. 각 비트는 다른 CPU를 구성합니다. 가장 작은 비트는 CPU 0입니다.

mask의 기본값은 f 이며, 이는 시스템의 모든 프로세서에서 인터럽트 요청을 처리할 수 있음을 의미합니다. 이 값을 1로 설정하면 프로세서 0만 인터럽트를 처리할 수 있습니다.

절차

  1. 바이너리에서 인터럽트를 처리하는 CPU의 값 1을 사용합니다. 예를 들어 인터럽트를 처리하기 위해 CPU 0 및 CPU 7을 설정하려면 0000000010000001 을 바이너리 코드로 사용합니다.

    표 29.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

  2. 바이너리 코드를 16진수로 변환합니다.

    예를 들어 Python을 사용하여 바이너리 코드를 변환하려면 다음을 수행합니다.

    >>> hex(int('0000000010000001', 2))
    
    '0x81'

    32개 이상의 프로세서가 있는 시스템에서는 개별 32비트 그룹의 smp_affinity 값을 줄여야 합니다. 예를 들어 64 프로세서 시스템의 첫 번째 32 프로세서만 인터럽트 요청을 서비스하려면 0xffffffffffffffffffffffffffffffffffffffffffffffffffff,00000000 을 사용합니다.

  3. 특정 인터럽트 요청의 인터럽트 선호도 값은 연결된 /proc/irq/irq_number/smp_affinity 파일에 저장됩니다. 이 파일에서 smp_affinity 마스크를 설정합니다.

    # echo mask > /proc/irq/irq_number/smp_affinity

추가 리소스

  • journalctl(1), irqbalance(1)taskset(1) 매뉴얼 페이지