irqbalance vs 수동 IRQ affinity 설정

이전 글에서는 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/irqbalanceIRQBALANCE_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로 그 의도를 명시적으로 알려주는 편이 안전하다.

참고

GitHub – Irqbalance/irqbalance

답글 남기기