目次

5.xでNICの割り込み処理のコア振り分け

現状の確認

現在のカーネルバージョンを確認

# uname -a
Linux kd-web25 2.6.18-308.13.1.el5 #1 SMP Tue Aug 21 17:10:18 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux

NICの割り込み処理が偏っていることを確認

# cat /proc/interrupts
           CPU0       CPU1       
  0:  513846733          0    IO-APIC-edge  timer
  1:          9          0    IO-APIC-edge  i8042
  6:          5          0    IO-APIC-edge  floppy
  7:          0          0    IO-APIC-edge  parport0
  8:          0          0    IO-APIC-edge  rtc
  9:          0          0   IO-APIC-level  acpi
 12:        109          0    IO-APIC-edge  i8042
 14:    5727120          0    IO-APIC-edge  ide0
 51:  107741677          0   IO-APIC-level  eth0
 59:         45          0   IO-APIC-level  ioc0
 67:          0          0   IO-APIC-level  vmci
NMI:          0          0 
LOC:  520967905  520924357 
ERR:          0
MIS:          0

ethX(上記ではeth0)の処理がCPU0に偏っていることがわかる。

作業開始

RPS/RFSの設定が可能なカーネルにバージョンアップ

# rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://elrepo.org/elrepo-release-5-4.el5.elrepo.noarch.rpm

# yum --enablerepo=elrepo-kernel install kernel-lt

起動時にインストールしたカーネルから起動してくるように設定

# vi /boot/grub/menu.lst 

-) default=1
+) default=0

再起動後、インストールしたカーネルで起動していることを確認

# shutdown -r now

# uname -a
Linux kd-web25 3.0.89-1.el5.elrepo #1 SMP PREEMPT Sun Aug 4 10:02:50 EDT 2013 x86_64 x86_64 x86_64 GNU/Linux

割り込み処理の状況を確認(NET_RX)

# watch -n1 cat /proc/softirqs

各CPUのNET_RXの値を監視

別窓を開いて、以下実行

# echo "f" > /sys/class/net/eth0/queues/rx-0/rps_cpus
# echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
# echo 32768 > /proc/sys/net/core/rps_sock_flow_entries

デフォルトはすべて“0”。
rps_cpusについては、“f”ではエラーになる場合がある。
その場合は、CPUの数に合わせてマスクを適宜変更する。
e.g. 2CPUの場合、“3”

# /etc/init.d/irqbalance start

上記を実行して割り込み処理の振り分けが確認されたら、次回起動時以降、自動で設定されるようにする。
(※確認した環境では、再起動後にすべてデフォルト“0”に戻っていた。)

# vi /etc/rc.local

+) echo 3 > /sys/class/net/eth0/queues/rx-0/rps_cpus
+) echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
+) echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
# chkconfig irqbalance on

参考

受信キューと CPU の対応付け
http://docs.oracle.com/cd/E39368_01/b71105/ol_about_uek.html

受信割込みを処理しているCPUを確認するには、コマンドwatch -n1 cat /proc/softirqsを使用して、各CPUのNET_RXの値を監視します。
https://www.nic.ad.jp/ja/materials/iw/2011/proceedings/s09/s09-01.pdf

CentOS5でもRPS/RFSでNICが捗る話
http://nekoya.github.io/blog/2012/11/13/centos5-rps-rfs/

CentOS 6.2 で RPS/RFS を使ってネットワークの割り込み処理を複数コアに分散してみた
http://blog.nomadscafe.jp/2012/08/centos-62-rpsrfs.html