サーバ性能を全開に!!

はじめまして

インフラ担当のたかやまです。

先日(と言ってもだいぶ前)、サーバマシンを購入し、サービスに組み込んだのですが、なかなか全開の性能を発揮させることができず、地味にハマったので その時の話を。

マシンスペックとサーバ構成

購入したマシンは以下。

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

参考:PRIMERGY RX200 S7 環境設定シート

結果 多少改善されたのですが、既存サーバには及びませんでした。

対策その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倍近い処理を捌くことが可能です。

めでたし めでたし!

終わりに

サーバ構成で書きましたが、BUYMARailsで動いています。 実際にはPHPフレームワークRailsが混在しており、現在、Railsに移行中です。

enigmoではRailsBUYMAを速くしたいエンジニアを募集しています。 →こちらまで