irqbalance - 인터럽트 분산 조정 치트시트
irqbalance는 CPU 코어 전체에 하드웨어 인터럽트 (IRQ)를 분산하는 데몬입니다. 기본적으로 Linux는 바쁜 NIC 또는 저장소 컨트롤러의 대부분 인터럽트를 CPU 0으로 라우트하여 해당 코어를 병목으로 만드는 동안 다른 코어는 유휴 상태입니다. irqbalance는 인터럽트 부하를 모니터링하고 IRQ 친화도를 재조정하여 작업을 분산합니다. 반대로 손으로 고정된 CPU를 가진 지연 중심 워크로드의 경우 비활성화되는 경우가 많으므로 격리된 코어의 인터럽트를 이동할 수 없습니다.
설치
| 플랫폼 | 명령 |
|---|
| Debian/Ubuntu | sudo apt install irqbalance |
| Fedora/RHEL | sudo dnf install irqbalance |
| Arch Linux | sudo pacman -S irqbalance |
| 서비스 | sudo systemctl enable --now irqbalance |
| 확인 | irqbalance --version |
먼저 인터럽트 검사
| 명령 | 표시 |
|---|
cat /proc/interrupts | 기기별 CPU별 인터럽트 개수 |
watch -n1 'cat /proc/interrupts' | 라이브 성장 (핫 코어 발견) |
mpstat -I SUM -P ALL 1 | 초당 CPU별 인터럽트 |
cat /proc/irq/<N>/smp_affinity | 하나의 IRQ에 대한 친화도 마스크 |
cat /proc/irq/<N>/smp_affinity_list | 동일하지만 CPU 목록으로 |
# 한 CPU가 모든 NIC 인터럽트를 흡수하고 있습니까?
watch -n1 "grep -E 'eth0|mlx|ens' /proc/interrupts"
데몬 실행
| 명령 | 설명 |
|---|
sudo systemctl status irqbalance | 실행 중인지 확인 |
sudo irqbalance --foreground | 포그라운드에서 실행 (디버깅) |
sudo irqbalance --oneshot | 한 번 균형 조정 후 종료 |
sudo irqbalance --debug | 상세 결정 |
주요 옵션 / 환경
| 설정 | 효과 |
|---|
IRQBALANCE_BANNED_CPUS=<mask> | 이 CPU에 IRQ를 할당하지 않음 |
--banirq=N | 특정 IRQ를 균형 조정에서 제외 |
--policyscript=PATH | IRQ별 정책을 결정하는 스크립트 |
--interval=SECONDS | 재조정 간격 |
| `—hintpolicy=exact | subset |
--powerthresh=N | 전원 절감 통합 임계값 |
구성은 일반적으로 /etc/default/irqbalance 또는 /etc/sysconfig/irqbalance에 존재합니다.
# 격리된 코어 8-15에서 IRQ 유지 (CPU 8..15를 위한 마스크)
echo 'IRQBALANCE_BANNED_CPUS=0000ff00' | sudo tee -a /etc/default/irqbalance
sudo systemctl restart irqbalance
수동 IRQ 친화도 (데몬을 비활성화할 때)
# IRQ 42를 CPU 2에 핀 (비트마스크 0x4)
echo 4 | sudo tee /proc/irq/42/smp_affinity
# 또는 CPU 목록으로
echo 2 | sudo tee /proc/irq/42/smp_affinity_list
| 접근 | 사용 |
|---|
| irqbalance 실행 | 일반 서버, 가변 부하 |
| irqbalance 비활성화 + 수동 핀 | 낮은 지연, NUMA 핀된, RT 워크로드 |
| 금지된 CPU | 하이브리드: 균형 조정이지만 격리된 코어 보호 |
낮은 지연 패턴
# 일반적인 낮은 지연 설정: 밸런서 중지, NIC IRQ를 앱의 NUMA 노드 근처로 핀
sudo systemctl stop irqbalance
sudo systemctl disable irqbalance
# 그런 다음 같은 NUMA 노드의 코어로 NIC의 IRQ에 대해 smp_affinity를 설정합니다.
numactl과 쌍을 이루어 애플리케이션의 메모리와 인터럽트 처리가 같은 NUMA 노드에 위치합니다. 노드 간 인터럽트 처리는 고전적인 숨겨진 지연 소스입니다.
변경 검증
| 확인 | 명령 |
|---|
| 인터럽트 분산 | mpstat -I SUM -P ALL 1 |
| Softirq 부하 | top → CPU별 %si |
| 네트워크 처리량 | sar -n DEV 1 |
| IRQ별 개수 | watch 'cat /proc/interrupts' |
성공은 인터럽트 개수가 의도된 코어 전체에서 균등하게 성장하거나 선택한 정확한 코어에 집중된 것처럼 보입니다.
irqbalance vs 관련 조정
| 도구 | 역할 |
|---|
| irqbalance | CPU 전체에 IRQ 분산 |
| numactl | 프로세스 CPU/메모리를 NUMA 노드에 바인드 |
| cpupower | 빈도/유휴 상태 제어 |
| tuned | 전체 시스템 프로필 (irqbalance 관리 가능) |
| RPS/RFS | 소프트웨어 측 패킷 스티어링 |
리소스