# 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
# 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に偏っていることがわかる。
# 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
# 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