- Apr
- 4
- 2014
TsungによるwebSocketの負荷テスト (テスト設定ファイル編)
Tsungの環境構築ができたので 実際にテストのシナリオをxml形式で作成します。
tsung.xmlの作成
詳しい設定は公式リファレンスを参照
今回のテストで達成したかった内容は サーバ側アプリケーションのwebsocketのエンドポイントに対して
- 一定のCCU(Concurrent Users)達成時の、サーバ側の振る舞い(処理ロジックと応答速度とサーバ負荷)の確認
- DAU(Daily Active User)達成時の、サーバ側の振る舞い(処理ロジックと応答速度とサーバ負荷)の確認
の2点のため、Tsungがエミュレートするクライアント側の処理はできるだけシンプルにしました。
DAUについてはとにかく数を増やして完了したプロセスから終わっても問題ないのですが、 一定数のCCUを達成するにはwebsocketのコネクションを確立したTsungプロセスを活かして置く必要があります。 そのため、heartbeatメッセージのような処理をループで追加しないと Tsungが生成したユーザはセッション完了後にプロセスを終了するのでCCUが維持できません。
注意点としては
TsungではwebsocketPing/Pongはまだ扱えない?ため サーバ側でPingを送ってもそれを処理することはできません。
また、日本語などの2byte文字もダメっぽいです。
実際に作ったxmlのサンプル
複雑なxmlと変数
xml内でErlangのモジュールを読み込んで処理したり、scriptとしてevalさせるなんて事もできます。 またJMeterのようにcsvを読み込むことももちろん可能です。
http://tsung.erlang-projects.org/user_manual/conf-advanced-features.html#dynamic-substitutions
ただしErlangについての知識がないととっつきにくいのです。僕は諦めました。
<setdynvars sourcetype="eval" code="fun({Pid, DynVars}) ->
case random:uniform(3) of
1 -> " low";
2 -> "mid";
3 -> "high";
end."
>
<var name="my_dynamic_var" />
こう書くと、my_dynamic_var
という変数がセットできます。
これを
<if var="my_dynamic_var" eq="3">
</if>
とか
<websocket frame="text" type="message">{"my_dynamic_var":%%_my_dynamic_var%%}</websocket>
と言った風に使うことができます。
レポートの出力
Tsung 実行時に ~/.tsung/log/XXXが作成され、そのディレクトリに各Tsungクライアントからログが集まってきます。
ログディレクトリに移動して以下のコマンドでhtml化されたグラフが生成されます。
~/opt/tsung-1.5.0/lib/tsung/bin/tsung_stats.pl
簡単でいいですね。
その他
今回はTsungに加えてNodeJSのwebsocket-benchも試してみました。 こちらはローカルマシンからもお手軽に実施でき、JavaScriptなのでwebSocketの処理も書きやすいです。
最終的に僕はTsungで一定数のCCUを達成した状態で、websocket-benchで細かい処理を書いたクライアントを走らせて応答処理時間を測るという方針でテストを実施しました。