こんにちは。久しぶりに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%前後となっており、負荷分散されていることがわかります。
グラフ上の緑の線が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%程度の差が出ています。
このことから割り込み処理が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使用率に偏りがあるときは確認してみると良いかと思います。