« vimでURL Unescape(utf-8) | トップページ | rubyによるAmazon EC2のインスタンスのセットアップ »

2011年10月10日 (月)

MongoDB+Rails3.1のベンチマーク

開発中のガラケー向けソーシャルゲームのスループットの計測を行なった。 サーバ構成は下記の通り

  • MongoDB 3台  version 2.0 Jarnalingあり ReplicaSet構成
  • Web    Nginx + unicorn + Rails3.1 + Mongoid

すべてのサーバはEC2のTokyo RegionのLarge 64bitインスタンスで構築し、Elastic Loadbalancer経由でWebサーバにアクセスするようにしている。
計測を行なったマシンもEC2上に作成し、apacheのabをコマンドを使用した。テストデータとして擬似的に10万件のダミーレコード をセットしたが、使用する検索クエリはすべてindexが使用されている。

下記が計測結果(単位はreq/sec)

Webサーバ 画像 DBアクセスなし DBアクセス1回 DBアクセス2回
1台 1206 484 43 25
5台 1557 1288 274 130
10台 2173 2864 483 222

結果から分かること。

  • Webサーバ台数が増えれば、DBアクセスのないRails経由のページのスループットが画像(nginx直)を上回っている。sizeの問題?
  • DBアクセスすると急激にスループットが落ちる
  • DBアクセス回数が2回になると、アクセス1回の半分にスループットが落ちる
  • Webサーバが増えると、線形的にスループットが上がるので、DBがボトルネックではない

たったDBアクセス2回で、メモリ:7.5 GB CPU:4 EC2 Compute Unitのマシンが1秒あたり30アクセスをさばけないなんて かなりショックなため、調査してみた。

ボトルネックはWebサーバのCPU
理由

  • Webサーバをメモリ1.7 GB CPU:1 EC2 Compute Unitのsmallに変えて計測してみたら、スループットが1/4になった。
  • ネットワークはDBアクセスなしのページとありのページで、ページサイズも変わらないため、十分余裕がある。
  • 負荷試験実行中メモリを計測してみたが、半分ぐらい余裕があり、swapも使っていない。
  • webサーバをsarで見ると、CPU使用率が4~50%,stealが5~60%だった。*1

Mongoidを使わず、Mongoドライバで直接アクセスしてみたり、connection poolのサイズを変更してみたりしたが、結果は ほとんど変わらず。
ちょっと困ってしまったが、EC2ではなく、localhostで実験してみたら、100/sec以上叩きだした!
localhostでの実験とEC2での試験の設定の違いって、replica setsのありなしのため、replica setsではなく、Master/Slave 構成でEC2上で試験してみた。

下記が計測結果(単位はreq/sec)

設定 DBアクセス1回 DBアクセス2回
replica sets 43.96 25.20
Master/Slave 154.56 112.97

スループットが劇的に改善された!!
replica setsを使用すると、WebサーバのMongoDriverによるCPU使用率が急激に上がるため、 1台あたりのスループットがかなり落ちるということがわかった。
なぜreplica setsを使うと、MongoDriverのCPU使用率が急激に上がるのかは未調査。

*1 はじめはtopで見ていて、CPU使用率が5~60%だったから、CPU関係ないよなと思っていて、それでも一応sarで確認すると、 stealが60%あって、stealって何って調べて、stealとはゲストOSがリソース要求を行ったにもかかわらずCPUリソースを割り 当ててもらえなかった時間の割合とあってなるほどーとなった。

|

« vimでURL Unescape(utf-8) | トップページ | rubyによるAmazon EC2のインスタンスのセットアップ »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/68673/52955838

この記事へのトラックバック一覧です: MongoDB+Rails3.1のベンチマーク:

« vimでURL Unescape(utf-8) | トップページ | rubyによるAmazon EC2のインスタンスのセットアップ »