2012年10月05日

負荷試験ツール「グリーン破壊」を公開しました

はてなブックマークに登録

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 オプションで見れるオプション一覧を参照してください。


@methane
klab_gijutsu2 at 19:52│Comments(0)TrackBack(0)

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント