CHAPTER 07
7. affinity, NMI, storm과 latency 상한을 분리해 측정한다
maskable IRQ의 IF/TPR/vector route와 NMI의 별도 entry를 구분하고, affinity migration, CPU idle/hotplug, interrupt storm에서 가장 긴 entry 지연을 추적합니다.
IF
maskable interrupt는 RFLAGS.IF와 local_irq_disable 구간에 지연될 수 있습니다.
NMI
일반 APIC priority/maskable IRQ와 다른 entry 및 nesting 규칙을 가집니다.
affinity
IOAPIC RTE, MSI message 또는 IRTE와 vector allocation이 함께 바뀝니다.
storm
장치 source를 먼저 제어하지 않으면 route만 바꿔 다른 CPU를 소진합니다.
레지스터·번호·소유권 대조
| 항목 | 소유자 | 값의 의미 | 정상 증거 | 오류 해석 |
|---|---|---|---|---|
| RFLAGS.IF | CPU | maskable IRQ 허용 | 지연 구간 trace와 일치 | 긴 irq-off |
| TPR/PPR/IRR | LAPIC | priority와 pending | entry 지연 원인 설명 | priority mask |
| RTE/MSI/IRTE target | routing | 현재 affinity CPU/vector | Linux mask와 일치 | stale target |
| NMI reason/state | platform/CPU | NMI source | 의도된 watchdog/MCE 등 | 원인 미식별 |
| irq count/latency | Linux/trace | CPU별 delivery와 시간 | migration 후 일관 | loss/tail |
실패 경계 판정
| 증상 | 직전 통과 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| affinity 이동 중 loss | steady state 정상 | vector/route update | sequence count와 migration trace | 이동 race |
| 특정 CPU만 tail 큼 | route 정상 | irqoff/SMI/NMI/idle | irqsoff와 hardware timestamp 비교 | CPU local 지연 |
| IRQ storm | handler count 증가 | device level/source clear | device mask 후 LAPIC/IOAPIC 상태 | 장치 원인 |
| NMI watchdog false positive | CPU 응답 일부 | SMI/irqoff/lockup 구분 | NMI backtrace와 tracing clock | 비마스크 지연 |
| hotplug 후 wrong CPU | CPU online/offline 성공 | route/vector cleanup | old/new vector count | lifecycle |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | 하드웨어 source timestamp와 entry trace를 맞춥니다. | 발생→entry delta | 실제 latency |
| 2 | affinity/idle/load/hotplug 조건을 직교 반복합니다. | 조건별 max/p99 | 민감 축 |
| 3 | 최장 지연에 IF/TPR/SMI/NMI 흔적을 붙입니다. | 지연 원인 | 상한 설명 |
| 4 | storm에서 장치 mask→source clear→route 복구 순서를 시험합니다. | 복구 후 count 안정 | 운영 절차 |
주의NMI context에서 일반 lock, printk와 handler를 그대로 사용하면 deadlock이나 측정 왜곡이 생길 수 있습니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 Linux v6.18.37 원본에서 다시 확인할 수 있는 범위만 사용했습니다.
Intel 64 and IA-32 SDM
Local APIC, x2APIC, interrupt/exception과 virtualization
Linux APIC code
APIC mode 선택과 초기화
Linux IOAPIC code
GSI와 redirection entry 관리
Linux vector allocator
CPU별 vector 할당과 이동