1.irqbalance概要
FedoraやRHEL,Suseなど多くのLinuxディストリビューションに標準実装されているデーモンで、マルチCPU環境において、IRQ割込み処理を複数のCPU間で負荷分散させることを目的としています。
2.詳細
Linux Kernelはデフォルトの状態では、CPU0のみでIRQ割込み(ハードウエアからの割込み要求)の処理を行います。しかしそれではIRQ割り込みが頻繁に発生する場合CPU0に負荷が偏りパフォーマンスが劣化する可能性があります。そこでマルチCPU環境でにおいてirqbalanceを導入することで、2nd CPU以降も割り込み処理を行えるようになります。
irqbalanceは、10秒毎に各CPUのIRQ割込み処理負荷状態状態に応じ、各CPUへのIRQ割込み処理の再配置をおこないます。CPUのIRQ割込み処理負荷状態は"/proc/interrupts"から算出しています。またIRQの再配置は、"/proc/irq/[IRQ番号]/smp_affinity"のCPUマスク設定を変更することで実現しています。
List.1 /proc/interruptsの例
# cat /proc/interrupts CPU0 CPU1 1: 76 0 Phys-irq-level i8042 6: 5 0 Phys-irq-level floppy 7: 0 0 Phys-irq-level parport0 8: 0 0 Phys-irq-level rtc 9: 0 0 Phys-irq-level acpi 12: 147 2867 Phys-irq-level i8042 14: 0 0 Phys-irq-level libata 15: 5427 6975 Phys-irq-level libata 17: 9064 1343 Phys-irq-level ioc0 18: 1525405 6344 Phys-irq-level peth0 256: 377093 0 Dynamic-irq-level timer0 257: 6835 0 Dynamic-irq-level resched0 258: 35 0 Dynamic-irq-level callfunc0 259: 0 6868 Dynamic-irq-level resched1 260: 0 89 Dynamic-irq-level callfunc1 261: 0 153764 Dynamic-irq-level timer1 262: 144 0 Dynamic-irq-level xenbus 263: 0 0 Dynamic-irq-level console NMI: 0 0 LOC: 0 0 ERR: 0
List.2 /proc/irq/[IRQ番号]/smp_affinityの例
# cat /proc/irq/17/smp_affinity 00000000,00000001
なおirqbalanceの実行周期はirqbalanceのソースコードにハードコーティングされており、設定で変更することはできません。
各CPUの割込み状態の確認は、/proc/interrupts にて確認することが可能です。
1CPU(1core)のみの環境の場合、irqbalanceを利用する必要はありません。(起動しようとしてもエラーとなります。)
3.サービス起動可否の考え方
irqbalanceに対するサービス可否の考え方を以下に示します。
・マルチCPU(マルチcore)環境の場合、irqbalanceを有効にする。
・1CPU(1core)環境の場合はirqbalanceを無効化する。