以前(2010年)に「アプリケーションがマルチスレッドでもマルチコアCPUを活かせない件」というエントリにてCPUのコアが増えても割り込み処理が分散されないのでスケールされないと書いたけど、その後Linux KernelにRPS/RFSなる機能が追加され、割り込み処理が分散できるようになり、CentOS 6.2 でも使えるらしいので試してみました。

RPS/RFSについての紹介は

が詳しい。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-softirq.png

このサーバではmemcachedが動いていて、CPUは4コア(8スレッド)、ピーク時に割り込み処理を担当するCPUは100%近い使用率となっていそうなので何かしらの対応が必要となってる

このブログ記事について

このページは、Masahiro Naganoが2012年8月 9日 17:15に書いたブログ記事です。

ひとつ前のブログ記事は「Perlでstrace -p pidして目的のシステムコールが来たら終了する」です。

次のブログ記事は「cron等をつかって外部のAPIに問い合わせる場合は、毎時0分を避けるのが大人のマナー」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja