以前(2010年)に「アプリケーションがマルチスレッドでもマルチコアCPUを活かせない件」というエントリにてCPUのコアが増えても割り込み処理が分散されないのでスケールされないと書いたけど、その後Linux KernelにRPS/RFSなる機能が追加され、割り込み処理が分散できるようになり、CentOS 6.2 でも使えるらしいので試してみました。
RPS/RFSについての紹介は
- VIOPS06で「RPS・RFS等最新Linux Kernel事例」と題してお話してきました
http://d.hatena.ne.jp/syuu1228/20110722/1311322653 - Linux内核 RPS/RFS功能详细测试分析
http://www.igigo.net/archives/204
が詳しい。2番目のはほぼ読めないけど、性能比較のグラフが分かりやすい。
今回試したサーバは、
- OS: CentOS 6.2
- Kernel: kernel-2.6.32-279.2.1.el6.x86_64
- CPU: Intel Xeon E3-1220L (2コア HT有効で4スレッド TDP 20W!)
- NIC: Intel i82574L
- NIC Driver: e1000e
という構成です。
この構成ではmulti queue (RSS: Receive Side Scaling)が有効ではないようなので割り込み処理が1コアに集中します
$ cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
34: 12093133 0 0 0 IR-PCI-MSI-edge eth1-rx-0
35: 12032740 0 0 0 IR-PCI-MSI-edge eth1-tx-0
36: 2 0 0 0 IR-PCI-MSI-edge eth1
interruptsをみると、CPU0に集中しているのがわかります
この状態でnginx(worker_processes 4)を起動し、別のサーバからweighttpを使って負荷を掛けたときのmpstatが次の通り。
CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
all 11.79 0.00 20.86 0.05 0.00 15.72 0.00 0.00 51.59
0 16.60 0.00 24.60 0.00 0.00 52.80 0.00 0.00 6.00
1 4.32 0.00 9.67 0.00 0.00 1.44 0.00 0.00 84.57
2 22.58 0.00 42.34 0.00 0.00 6.65 0.00 0.00 28.43
3 3.37 0.00 6.94 0.20 0.00 1.98 0.00 0.00 87.50
CPU0だけ「%soft」を使い、%idleが残り6%となってしまっています。
次にRPS/RFSを有効にします
echo "f" > /sys/class/net/eth1.xx/queues/rx-0/rps_cpus
echo 4096 > /sys/class/net/eth1.xx/queues/rx-0/rps_flow_cnt
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
cat /sys/class/net/eth1.xx/queues/rx-0/rps_cpus
00000000,0000000f
今回のサーバではVLANを使っているのでデバイスは「eth1.xx」です。ちなみに、multi queue(RSS)をサポートしているNICだと、rx-0のところがいくつか増えますが、今回は1つです
これで再度同じ負荷を掛けてみたときのmpstatが次の通り。
CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
all 10.49 0.00 18.99 0.00 0.00 16.85 0.00 0.00 53.67
0 16.90 0.00 29.18 0.00 0.00 29.18 0.00 0.00 24.75
1 7.71 0.00 14.17 0.00 0.00 9.58 0.00 0.00 68.54
2 10.88 0.00 20.33 0.00 0.00 14.99 0.00 0.00 53.80
3 6.20 0.00 12.00 0.00 0.00 13.60 0.00 0.00 68.20
「%soft」の項目がCPU0以外にも分散されているのが分かります。CPU0のidleもまだ30%近くあります。
今回のテストではweighttpの結果に差はあまりありませんでしたが、↓こういうサーバに投入してみたいなと思っているところです
このサーバではmemcachedが動いていて、CPUは4コア(8スレッド)、ピーク時に割り込み処理を担当するCPUは100%近い使用率となっていそうなので何かしらの対応が必要となってる