RailsのWebアプリサーバとしてはthinを使っています。thinにしたのはWebsocketRailsが動くととという要件があったからです。
thinにはいくつかのパラメータの調整ができます。大きなところでは、-threadedでマルチスレッド化したり、-serverで起動プロセス数を調整できます。threadedオプションはまだ、Experimentalなのでどんなものなのか、を見てみたいと。
計測
計測はhttp_loadを使いました。次のように実行しています。Nは同時アクセス数。
./http_load -parallel $N -fetches $N url.txt
ちなみに、UbuntuでCPUは4Core。メモリは8Gぐらいのマシンで計測。
-threadedオプション
まずは、-threadedオプションのある、なしでの計測です。Nは1から100まで。
グラフではわかりにくいですが、20ちょっとまではthreadedオプションをつけた方が数%ほどパフォーマンスがいい傾向にあります。しかし、23スレッドを超えたあたりから急激にパフォーナンスが悪化してます。
コンソールには、次のようなエラーが出ています。
ActiveRecord::ConnectionTimeoutError (could not obtain a database connection within 5.000 seconds (waited 5.003 seconds)):
データベースへの同時接続数を増やせば安定すると思いますが、数%のパフォーマンスと引き換えに、APをスケールさせるときに不安を持つのはうれしくないので、threadedオプションは使わないのがよいかと。
-serverオプション
スレッドではなくプロセスの数で調整ってのは*nixではよくある手法ですね。
serverオプションを1, 2, 4で計測したのが次の結果です。
プロセス数が1から2になると、ほぼ、2倍の性能向上ですね。同時アクセス数に対してもリニアに性能悪化してます。プロセス数を4にすると1から2にしたときほどの効果はないものの1.5倍程度の性能改善です。
まとめ
threadedオプションは使わない方がよい。その代わりserverオプションでプロセス数を変えよう。
まだ、やっていないことは、WebSocketを使った時の振る舞い。長時間の同時コネクションでの振る舞いを見てみたいです。