負荷試験ツール「グリーン破壊」を公開しました
takada-at 作の インターネット破壊 を Python + Gevent で書きなおした グリーン破壊 を公開しました。
なんで作りなおしたのか
インターネット破壊は Ruby + rev 製なのですが、 Ruby のバージョンや gem まわりなどが Ruby に詳しくない人にとっては複雑で、セットアップに数時間かかることがありました。 また、インターネット破壊が使っている rev というライブラリはオワコンらしいです。 さらに、 Rev を使ってイベントドリブンの書き方をしているために複雑で、カスタマイズや デバッグが難しいという問題もありました。
結局、インターネット破壊が期待通りに動かなくて調査していた時に、調査するよりも Gevent で書きなおした方が早い!と思って書き直してしまいました。
パフォーマンス
グリーン破壊は内部でコネクションプールを利用しており、 keep alive が効く環境で パフォーマンスを発揮します。
Xeon(R) L5410 @ 2.33GHz (8スレッド) のマシンから、 50並列x8プロセスで小さい テキストファイルを取得するテストをしたところ、秒間 25000 リクエストくらいは 出ていました。
使い方
インストール
Python 2.6 以上と、その拡張をビルドできる環境が必要です。
Debian や Ubuntu であれば python-dev
, CentOS や Fedora であれば python-devel
パッケージがインストールされていれば問題ありません。
$ git clone https://github.com/KLab/green-hakai.git
$ cd green-hakai
$ python virtualenv.py ~/ghakai
$ source ~/ghakai/bin/activate
(ghakai) $ pip install -r requirements.txt
(ghakai) $ python setup.py install
シナリオを書く
だいたいインターネット破壊と同じです。
# scenario.yml
host: "http://example.com"
actions:
- path: /
- path: /foo
- path: /bar
method: POST
post_params:
fizz: buzz
spam: egg
トップレベルに query_params
を定義しておくと、勝手にすべてのリクエストにそのクエリパラメーターを
追加することができます。
query_params:
foo: bar # ?foo=bar がすべてのアクセスに付与される.
インターネット破壊であった action クラスを指定して動作を変更する機能は、 複数の動作を同時にできない (リダイレクトのチェックとレスポンスから変数のキャプチャをするなど) のが嫌だったので、別の記述方法で実現する予定です.
変数を使う
インターネット破壊には vars
という1種類の変数しかありませんでしたが、
グリーン破壊はそれに加えて exvars
, consts
という変数も追加しました。
vars
の内容は、シナリオごとにファイルからランダムに選択されるのに対して、
exvars
の内容は並列して実行しているシナリオ間で排他的に選択されるので、
ユーザーIDなどを指定するのに便利です。
vars:
- name: foo
file: foos.txt
exvars:
- name: user_id
file: user_ids.txt
一方、 consts
はすべてのシナリオで固定の値を使います。値が1つでいいので
file から読み込むのではなく直接 Yaml で値を定義します。
consts:
app_id: hogehoge
この用に定義した変数は、シナリオのパスの中や、 query_params
, post_params
の値の中に、
%(変数名)%
という形をした部分に置換されます。
ユースケースとして、負荷試験中は認証をスキップしてクエリパラメーターでユーザーIDを指定する場合、 次のように設定できます。
exvars:
- name: user_id
file: user_ids.txt # 負荷試験用のダミーIDのリスト
query_params:
__loadtest_user_id: %(user_id)% # ?__loadtest_user_id=ユーザーID を設定する.
実行する
次のようにコマンドを実行します.
$ ~/ghakai/bin/ghakai scenario.yml
~/ghakai/bin
を PATH に追加するか、PATHに追加しているディレクトリから ~/ghakai/bin/ghakai
に symlink をしておくと便利です。
並列数を設定するには、 -c 10
のようにオプションを指定します。性能を上げるためには
--fork 4 -c 10
のように指定すると、4プロセスから各々10並列でシナリオを実行する用になります。
実行オプションはシナリオファイルで指定することもできます。(コマンドラインで指定した値が優先されます。)
実行オプションの詳細は サンプルの設定ファイル
と、 -h
オプションで見れるオプション一覧を参照してください。