====== 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