はじめまして
インフラ担当のたかやまです。
先日(と言ってもだいぶ前)、サーバマシンを購入し、サービスに組み込んだのですが、なかなか全開の性能を発揮させることができず、地味にハマったので その時の話を。
マシンスペックとサーバ構成
購入したマシンは以下。
FUJITSU / PRIMERGY RX200 S7 CPU : Xeon E5-2670(2.60GHz) 2CPU 16core
Railsサーバにするため、以下の構成にしました。
ホストOS : CentOS6.4 + Xen4.2 仮想OS : CentOS6.3 + Unicorn4 + Rails3 + Ruby2
既存Railsサーバは以下。
Dell / PowerEdge RX200 CPU : Intel Xeon X5650(2.67GHz) 1CPU 6core``` 構成は同じですが、ホストOSのOSとXenのバージョンが違います。
ホストOS : CentOS6.3 + Xen4.1 仮想OS : CentOS6.3 + Unicorn4 + Rails3 + Ruby2
大きな違いはCPU。 世代が変わって、かなり性能が向上しているそうです。
参考:次世代データセンターの新基準へ インテルが「Xeon E5-2600/1600」を発表
性能比較 : なぜか既存サーバより遅い新規サーバ
既存サーバと新規サーバで条件を揃えて新規サーバをサービスへ組み込み、Railsの1アクセスに対する"平均処理時間"を比較しました。
・新規サーバ : 0.32秒 ・既存サーバ : 0.26秒
あれ? 既存サーバより遅い。。。 Unicornはシングルスレッドアプリケーションですが、CPUの性能UPで"平均処理時間"も少しは速くなる想定でした。
対策その1 : BIOSを性能優先に
まず確認したのはBIOS。 デフォルトでは"性能と消費電力のどちらも最適になる設定"になっていたので、性能が最優先になる設定に変更しました。
CPU Configuration ・Power Technology: Energy Efficient => Custom ・Energy Performance: Balanced Performance => Performance ・CPU C6 Report: Enabled => Disabled ・Package C-State limit: No Limit => C0
結果 多少改善されたのですが、既存サーバには及びませんでした。
対策その2 : XenのVCPU設定をチューニング
その次にXenの仮想OSのVCPU設定をチューニングしました。
以下はRailsサーバをホストOS内に2つ起動し、各RailsサーバのUnicornのworkerを32個起動した場合に最もパフォーマンスが発揮されたパラメータです。
・VCPU数=Unicornのworker数(物理コア数16コア×2CPUと同一にしました) ・VCPUへのコアの割り振り=1CPUのコアを全てを割り振る (Railsサーバ1は全てのVCPUでコア番号:0-15、Railsサーバ2は16-31)
# vi /etc/xen/<仮想OS名> vcpus = 32 cpus = ["0-15","0-15","0-15",・・・]
結果 それでも既存サーバには及ばず。。
対策その3 : ボトルネック調査
ホストOSや仮想OSのCPUやメモリ等を確認しましたが、特にリソース不足は発生していません。
そこで、turbostatというツールでCPU動作クロックを確認しました。 以下のサイトを参考にさせていただきました。 CentOSにおけるintel CPU ターボブースト動作の確認
turbostatを実行すると、動作クロックと、CPUの省電力状態を表示し続けます。 (デフォルトだと5秒間隔でフラッシュします)
C0とC1の欄がちゃんと表示されませんでしたが、TSCの欄が標準クロックで、GHzの欄で実際に動作している動作クロックです。
既存サーバでは、ほとんど2.6GHz以上で動作していますが、 新規サーバでは、ほとんど2GHz以下で動作していました。
結果 やはり、CPUが全開の性能を発揮できていないことがボトルネックだと判明しました。
新規サーバ
# ./turbostat CPU %c0 GHz TSC %c1 %c3 %c6 %c7 %pc2 %pc3 %pc6 %pc7 **** **** 2.60 **** 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0 **** **** 2.60 **** 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1 **** **** 2.60 **** 0.00 0.00 0.00 0.00 0.00 0.00 0.00 2 **** 1.2* 2.60 **** 0.00 0.00 0.00 0.00 0.00 0.00 0.00 3 **** 1.2* 2.60 **** 0.00 0.00 0.00 0.00 0.00 0.00 0.00 4 **** 1.2* 2.60 **** 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5 **** 1.2* 2.60 **** 0.00 0.00 0.00 0.00 0.00 0.00 0.00 6 **** 1.2* 2.60 **** 0.00 0.00 0.00 0.00 0.00 0.00 0.00 7 **** 1.2* 2.60 **** 0.00 0.00 0.00 0.00 0.00 0.00 0.00 8 **** **** 2.60 **** 0.00 0.00 0.00 0.00 0.00 0.00 0.00 9 **** 1.2* 2.60 **** 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10 **** 1.2* 2.60 **** 0.00 0.00 0.00 0.00 0.00 0.00 0.00 11 **** 2.1* 2.60 **** 0.00 0.00 0.00 0.00 0.00 0.00 0.00
既存サーバ
# ./turbostat CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6 **** **** 2.66 **** 0.00 0.00 0.00 0.00 0 **** **** 2.66 **** 0.00 0.00 0.00 0.00 1 **** **** 2.66 **** 0.00 0.00 0.00 0.00 2 **** **** 2.66 **** 0.00 0.00 0.00 0.00 3 **** **** 2.66 **** 0.00 0.00 0.00 0.00 4 **** **** 2.66 **** 0.00 0.00 0.00 0.00 5 **** **** 2.66 **** 0.00 0.00 0.00 0.00 6 **** **** 2.66 **** 0.00 0.00 0.00 0.00 7 **** 2.9* 2.66 **** 0.00 0.00 0.00 0.00 8 **** 2.9* 2.66 **** 0.00 0.00 0.00 0.00 9 **** 2.9* 2.66 **** 0.00 0.00 0.00 0.00 10 **** 2.9* 2.66 **** 0.00 0.00 0.00 0.00 11 **** 2.8* 2.66 **** 0.00 0.00 0.00 0.00
最大の原因が判明!
CPUが全開の性能を発揮できていないということで、CPUの動作クロックをコントロールしている機能を調査しました。
サポートに聞いたり、ググったり、BIOSでもない、Xenでもない、OS(cpuspeed)でもない、くぁwせdrftgyふじこlp
・・・そしてついにCPU動作でクロックをコントロールしている犯人を発見。
XenのCPUクロックをコントロールする機能(cpufreq)が省電力モードになっていました。。 ※既存サーバではXenのcpufreqが無効になっていて、BIOSのみの設定変更で全開の性能が発揮できていたようです。
性能優先にするため、親ホストで以下のコマンドを実行。(/etc/rc.localにも追加)
# xenpm set-scaling-governor performance # xenpm set-scaling-minfreq 2601000
参考 Xen power management Xenpm command
結果
設定変更の結果、だいぶ改善されました。
# ./turbostat CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6 **** **** 2.66 **** 0.00 0.00 0.00 0.00 0 **** **** 2.66 **** 0.00 0.00 0.00 0.00 1 **** **** 2.66 **** 0.00 0.00 0.00 0.00 2 **** **** 2.66 **** 0.00 0.00 0.00 0.00 3 **** **** 2.66 **** 0.00 0.00 0.00 0.00 4 **** 2.9* 2.66 **** 0.00 0.00 0.00 0.00 5 **** **** 2.66 **** 0.00 0.00 0.00 0.00 6 **** **** 2.66 **** 0.00 0.00 0.00 0.00 7 **** **** 2.66 **** 0.00 0.00 0.00 0.00 8 **** **** 2.66 **** 0.00 0.00 0.00 0.00 9 **** **** 2.66 **** 0.00 0.00 0.00 0.00 10 **** 2.9* 2.66 **** 0.00 0.00 0.00 0.00 11 **** 2.9* 2.66 **** 0.00 0.00 0.00 0.00
もう1度、平均処理時間を比較。
・新規サーバ 0.23秒 ・既存サーバ 0.26秒
おおー (ちょっと)速い! それに コアが多いので、同時に3倍近い処理を捌くことが可能です。
めでたし めでたし!
終わりに
サーバ構成で書きましたが、BUYMAはRailsで動いています。 実際にはPHPのフレームワークとRailsが混在しており、現在、Railsに移行中です。