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