読者です 読者をやめる 読者になる 読者になる

のぴぴのメモ

自分用のLinuxとかの技術メモ

irqbalanceサービスについて

1.irqbalance概要

 FedoraRHEL,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を無効化する。