irqbalanceによるCPUへの割り込み処理の負荷分散について調べてみた

こんにちは。久しぶりにJMeterと戯れている浅見です。
先日、irqbalanceが無効化されているサーバがありました。普段あまり気にしたことがなかったサービスですが、割り込み処理を負荷分散してくれる機能ということで俄然興味が。実際に動かしてみて調べてみましょう。

irqbalanceとは

ざっくり説明すると、このような機能です。

  • Linuxカーネルの動きとして、割り込み処理はCPU0のみで処理する
  • irqbalanceを利用することで、割り込み処理を複数のCPUで負荷分散ができる
  • RHELやCentOSではirqbalanceがデフォルトで有効になっている
  • 複数コアを利用する場合はirqbalanceが有効になっていたほうが良い
  • 単一コアの場合は有効にする意味はない
     
    要はネットワークやディスクIOなどの割り込み処理を負荷分散してくれる機能ということです。

    irqbalanceの設定有無によるCPU負荷の変化を確認してみる

    言葉だけではわかりにくいのて、実際にサーバへ負荷をかけてみてirqbalanceの実力を調べてみます。
    ファイル出力を行う簡単なWEBアプリケーションを作成し、JMeterで負荷をかけてみました。

    irqbalanceが有効の場合

    まずは、irqbalanceが有効な場合です。割り込み処理をCPU0とCPU1で負荷分散しているはずです。
    JMeterで負荷をかけてみたところ、下の図の通りCPU0とCPU1のSYSTEM使用率が30%前後となっており、負荷分散されていることがわかります。
    irqbalancecpu_1.png
    グラフ上の緑の線がSYSTEM使用率で、主にカーネルが利用しているCPU使用率です。処理切り替えのコンテキストスイッチや割り込み処理などの用途で利用されています。
    実際に割り込み処理がどちらのCPUで行われたかをみてみましょう。

    [root@irqbalance.enable ~]# cat /proc/interrupts |egrep "CPU|ens"
    CPU0       CPU1
    56:       1852     146690   PCI-MSI-edge      ens160-rxtx-0
    57:     131214          0   PCI-MSI-edge      ens160-rxtx-1
    58:          0          0   PCI-MSI-edge      ens160-event-2
    59:      12070     102641   PCI-MSI-edge      ens192-rxtx-0
    60:          4          0   PCI-MSI-edge      ens192-rxtx-1
    61:          0          0   PCI-MSI-edge      ens192-event-2
    

    CPU0とCPU1の両方で行われていることがわかります。

    irqbalanceが無効の場合

    次に、irqbalanceが無効の場合です。割り込み処理をCPU0のみで処理しているはずです。
    結果は、CPU0のSYSTEM利用率が30%付近なのに対して、CPU1のSYSTEM利用率は20%となりました。10%程度の差が出ています。
    irqbalancecpu_2.png
    このことから割り込み処理がCPU0に偏っていることが見て取れます。
    実際にコマンドで確認してみます。

    [root@irqbalance.disable ~]# cat /proc/interrupts |egrep "CPU|ens"
    CPU0       CPU1
    56:     142544          0   PCI-MSI-edge      ens160-rxtx-0
    57:     136023          0   PCI-MSI-edge      ens160-rxtx-1
    58:          0          0   PCI-MSI-edge      ens160-event-2
    59:      45089          0   PCI-MSI-edge      ens192-rxtx-0
    60:          7          0   PCI-MSI-edge      ens192-rxtx-1
    61:          0          0   PCI-MSI-edge      ens192-event-2
    

    CPU0のみで処理されていますね。

    irqbalanceについて

    せっかくなので、irqbalanceについてまとめておきます。

    起動方法

    irqbalanceはサービスとして登録されています。CentOS7系の場合は下記コマンドで自動起動有無を確認できます。

    # systemctl list-unit-files |grep irqbalance
    irqbalance.service                            disabled
    

    起動したい場合はsystemctlで起動しましょう。

    
    # systemctl start irqbalance.service
    

    起動後は、statusやプロセス有無を確認しておきます。

    [root@irqbalance.enable ~]# systemctl status irqbalance.service
    ● irqbalance.service - irqbalance daemon
    Loaded: loaded (/usr/lib/systemd/system/irqbalance.service; disabled; vendor preset: enabled)
    Active: active (running) since 水 2018-09-12 18:12:54 JST; 8s ago
    Main PID: 2687 (irqbalance)
    CGroup: /system.slice/irqbalance.service
    mq2687 /usr/sbin/irqbalance --foreground
    [root@irqbalance.enable ~]# ps auwxxx|grep irqbalance
    avahi      557  0.0  0.1  62236  2292 ?        Ss   17:55   0:00 avahi-daemon: running [irqbalance.local]
    root       775  0.0  0.1 107396  2296 ?        Ss   17:55   0:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient--ens160.lease -pf /var/run/dhclient-ens160.pid -H irqbalance ens160
    root       885  0.0  0.1 107396  2292 ?        Ss   17:55   0:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient--ens192.lease -pf /var/run/dhclient-ens192.pid -H irqbalance ens192
    root      2687  0.0  0.0  21676  1300 ?        Ss   18:12   0:00 /usr/sbin/irqbalance --foreground
    root      2695  0.0  0.0 112724   980 pts/0    S+   18:13   0:00 grep --color=auto irqbalance
    

    割り込み処理の確認

    実際に割り込み処理がどこのCPUで行われているかは、「/proc/interrupts」ファイルに記録されています。

    [root@irqbalance.enable ~]# cat /proc/interrupts
    CPU0       CPU1
    0:         30          0   IO-APIC-edge      timer
    1:         10          0   IO-APIC-edge      i8042
    6:          2          0   IO-APIC-edge      floppy
    7:          0          0   IO-APIC-edge      parport0
    8:          1          0   IO-APIC-edge      rtc0
    9:          0          0   IO-APIC-fasteoi   acpi
    12:         16          0   IO-APIC-edge      i8042
    14:          0          0   IO-APIC-edge      ata_piix
    15:       1241          0   IO-APIC-edge      ata_piix
    16:          0          0   IO-APIC-fasteoi   vmwgfx
    17:       9687         22   IO-APIC-fasteoi   ioc0
    24:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    25:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    26:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    27:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    28:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    29:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    30:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    31:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    32:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    33:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    34:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    35:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    36:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    37:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    38:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    39:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    40:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    41:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    42:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    43:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    44:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    45:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    46:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    47:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    48:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    49:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    50:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    51:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    52:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    53:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    54:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    55:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    56:     149407       1908   PCI-MSI-edge      ens160-rxtx-0
    57:     136580          0   PCI-MSI-edge      ens160-rxtx-1
    58:          0          0   PCI-MSI-edge      ens160-event-2
    59:      99987          0   PCI-MSI-edge      ens192-rxtx-0
    60:         12          1   PCI-MSI-edge      ens192-rxtx-1
    61:          0          0   PCI-MSI-edge      ens192-event-2
    62:        200         14   PCI-MSI-edge      vmw_vmci
    63:          0          0   PCI-MSI-edge      vmw_vmci
    NMI:          0          0   Non-maskable interrupts
    LOC:     112586     122608   Local timer interrupts
    SPU:          0          0   Spurious interrupts
    PMI:          0          0   Performance monitoring interrupts
    IWI:        818       3257   IRQ work interrupts
    RTR:          0          0   APIC ICR read retries
    RES:      23226      80230   Rescheduling interrupts
    CAL:        515       2774   Function call interrupts
    TLB:        266        383   TLB shootdowns
    TRM:          0          0   Thermal event interrupts
    THR:          0          0   Threshold APIC interrupts
    DFR:          0          0   Deferred Error APIC interrupts
    MCE:          0          0   Machine check exceptions
    MCP:          4          4   Machine check polls
    ERR:          0
    MIS:          0
    PIN:          0          0   Posted-interrupt notification event
    NPI:          0          0   Nested posted-interrupt event
    PIW:          0          0   Posted-interrupt wakeup event
    

    まとめ

    irqbalanceが有効になっていることで、割り込み処理が複数のコアに負荷分散されていることがわかりました。
    通常はデフォルトで有効になっているので問題なさそうですが、CPUのSYSTEM使用率に偏りがあるときは確認してみると良いかと思います。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA