できあがるもの
- 単一エンドポイントに対して、ただひたすらリクエストを投げまくるようなシンプルな負荷試験環境
- 負荷はクライアント側のインスタンスを増やせば結構どんどん増やせる(15,000qpsまでは確認済)
- シナリオがー とか、計測のUIがー とか、料金がー とかは全く考えず、サクッと作ってサクッと試すためのもの
環境
- GCP(AWSでもいけるはず)
- クライアント(GCE) -> サーバー(GAE) の単一のendpointに対してリクエスト
- GCEのOSはCentOS7
やることを3行で
-
- instanceを起動
-
- tsungをインストール
-
- 設定ファイルを用意&&実行
手順
1. instanceを用意
- サーバーとなるGAEと同じリージョンでGCEのinstanceを起動させます
- machine_typeはmicroとかでだいじょぶ
- OSはCent7の前提ですすめる
2. tsungをインストール
- tsungってなに?
- Erlang性の負荷試験ツール -> tsung
- 起動したインスタンスにログインしてrootになってyum installでおk
# ログイン
sudo su -
yum install tsung
3. 設定ファイルを用意して実行
設定ファイルの作成
- root直下に設定ファイル setting.xml を作成
- この設定で秒間4000 - 5000qpsくらいリクエストが1時間ほど飛びます
- 詳しい設定内容は -> tsung.config
setting.xml
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">
<clients>
<client host='localhost' maxusers="1000000" use_controller_vm="true"/>
</clients>
<servers>
<server host="myproject.appspot.com" port="443" type="ssl"/>
</servers>
<load>
<arrivalphase phase="1" duration="60" unit="minute">
<users maxnumber="10000000" arrivalrate="10" unit="second"/>
</arrivalphase>
</load>
<sessions>
<session probability="100" name="http-test" type="ts_http">
<for from="1" to="1000" incr="1">
<request subst="true">
<http url="/some_path?param1=aaa&param2=iii" method="GET" version="1.1" />
</request>
</for>
</session>
</sessions>
</tsung>
tsungを実行
tsung -f setting.xml -l log start
以上。試験が終わったら立てたインスタンスは停止しましょう。
補足
-
負荷を増やしたければクライアントとなるインスタンスを増やしていきましょう
- 4インスタンスで15,000qpsになりました
-
クライアント側のログはroot直下の
log/YYYYMMdd-HHDD/tsung.log
に吐かれます -
10秒毎にログが吐かれるので例えば以下のようにtailすると10秒ごとのリクエスト数がわかったりします
tail -f log/20181030-0918/tsung.log | grep request
- 動的にクエリパラメータを変えたりもできます
- user & request_countをパラメータに指定してリクエストを送りたかったので以下のようにしました
-
%%hoge:fuga%%
で囲ってライブラリ変数を指定すると出力できるようです - 詳しく -> Advanced Features
setting.xmlのsessionの部分
<sessions>
<session probability="100" name="http-test" type="ts_http">
<for from="1" to="1000" incr="1" var="counter">
<request subst="true">
<http url="/some_path?user=%%ts_user_server:get_unique_id%%&counter=%%_counter%%" method="GET" version="1.1" />
</request>
</for>
</session>
</sessions>