이전 글에서는 smp_affinity로 IRQ를 특정 코어에 수동 고정해 쏠림을 해결했다. 그런데 코어가 수십 개고 트래픽 패턴이 계속 바뀌는 서버라면 매번 손으로 재배치하는 대신, 대부분의 배포판이 기본 설치해두는 irqbalance 데몬이 자동으로 이 일을 하는데 정작 수동으로 튜닝해둔 값을 슬그머니 되돌려버릴 때가 있다. 이 글에서는 irqbalance가 실제로 무엇을 보고 판단하는지 확인하고 수동 설정과 공존시키는 방법을 정리한다.
irqbalance 설치와 기본 동작
$ sudo apt-get install -y irqbalance
$ systemctl is-active irqbalance
active
기본 설정(/etc/default/irqbalance)에 따르면 irqbalance는 10초 주기로 각 IRQ의 부하를 관측하고, 변화가 감지된 IRQ만 재배치를 검토한다. NUMA 노드와 CPU 캐시 도메인 구조까지 인식해서 같은 캐시를 공유하는 코어 그룹 단위로 배치하는 것이 수동 smp_affinity 설정과 가장 다른 점이다.
irqbalance가 보는 토폴로지
--debug 옵션으로 실행하면 irqbalance가 인식한 캐시 도메인과 각 IRQ의 등록 상태를 그대로 출력한다.
$ sudo irqbalance --oneshot --debug
Package 0: numa_node 0 cpu mask is 0000003f (load 0)
Cache domain 0: numa_node is 0 cpu mask is 00000020 (load 0)
CPU number 5 numa_node is 0 (load 0)
Cache domain 1: numa_node is 0 cpu mask is 00000008 (load 0)
CPU number 3 numa_node is 0 (load 0)
Cache domain 2: numa_node is 0 cpu mask is 00000002 (load 0)
CPU number 1 numa_node is 0 (load 0)
Adding IRQ 21 to database
Adding IRQ 20 to database
Adding IRQ 9 to database
...
이 VM은 코어 6개가 전부 캐시 도메인 하나에 딸린 단순 구조라 실제 효과는 크지 않지만, 물리 서버처럼 소켓·L3 캐시 도메인이 나뉜 환경에서는 이 토폴로지 인식이 어떤 코어 그룹으로 IRQ를 몰아줄지 결정하는 핵심 근거가 된다.
수동 설정과의 공존
irqbalance를 켠 상태에서 IRQ 21(ahci)을 CPU2로 수동 고정한 뒤 데몬을 재시작해 값이 유지되는지 확인했다.
$ sudo systemctl stop irqbalance
$ echo 2 | sudo tee /proc/irq/21/smp_affinity_list
$ sudo systemctl start irqbalance
$ sleep 2 && cat /proc/irq/21/smp_affinity_list
2
이 VM은 유휴 상태라 irqbalance가 재배치 근거(부하 변화)를 못 찾아 값이 그대로 유지됐다. irqbalance는 “지금 이 IRQ가 바쁜가”만 보지, 관리자가 수동 고정했다는 사실 자체는 모르므로 트래픽이 실제로 몰리는 환경에서는 이 값이 언제 되돌려질지 예측하기 어렵다.
irqbalance를 끄지 않으면서 특정 코어를 확실히 배제하고 싶다면 /etc/default/irqbalance의 IRQBALANCE_BANNED_CPULIST를 쓰는 게 우연에 의존하지 않는 방법이다.
# /etc/default/irqbalance
IRQBALANCE_BANNED_CPULIST=2
이 값을 설정하면 irqbalance는 재배치 대상에서 해당 CPU를 아예 제외한다. 즉 그 코어로 몰린 IRQ를 다른 코어로 옮기지도 않고, 다른 IRQ를 그 코어로 새로 배정하지도 않는다.
언제 무엇을 쓸지
| 상황 | 추천 |
|---|---|
| 트래픽 패턴이 시간대별로 바뀌는 일반 서버 | irqbalance 자동 배치 |
| 특정 코어를 실시간/저지연 애플리케이션 전용으로 격리 | 해당 코어를 IRQBALANCE_BANNED_CPULIST로 제외 + 수동 smp_affinity |
| NIC 멀티큐 + RSS로 이미 큐별 코어가 정해진 환경 | irqbalance 끄고 전부 수동 고정(캐시 지역성을 애플리케이션이 직접 관리) |
| 단발성 벤치마크/디버깅 | irqbalance --oneshot으로 1회만 재배치 후 종료 |
주의사항
| 항목 | 내용 |
|---|---|
| 수동 고정은 우연에 의존 | irqbalance가 켜진 채로 값만 수동으로 바꾸면, 재배치 시점의 부하 상태에 따라 유지될 수도 되돌아갈 수도 있다. 확실한 배제는 IRQBALANCE_BANNED_CPULIST로 |
| BANNED_CPULIST 변경은 서비스 재시작 필요 | /etc/default/irqbalance는 환경변수 파일이라 systemctl restart irqbalance를 해야 반영된다 |
| 공유 IRQ는 밴 리스트도 전체 적용 | 여러 디바이스가 같은 IRQ 번호를 공유하면 밴 설정도 그 IRQ 전체에 적용된다 |
| 완전히 끄면 재배치가 멈춘다 | systemctl stop irqbalance 후에는 어떤 코어가 과부하여도 자동으로 옮겨주지 않으므로, 끄기로 했다면 모니터링 체계를 별도로 준비해야 한다 |
마무리
irqbalance는 부하 변화를 관측해 재배치하는 데몬이지, 관리자의 수동 설정 의도를 이해하는 도구가 아니다. 일반적인 상황에서는 자동 배치에 맡기고, 특정 코어를 확실히 격리해야 한다면 껐다 켰다 하는 대신 IRQBALANCE_BANNED_CPULIST로 그 의도를 명시적으로 알려주는 편이 안전하다.