DESTROY YOUR INTERNET
負荷試験スクリプト: インターネット破壊
インターネット破壊とは何か
CUIで使える高機能な負荷試験スクリプトです。 設定ファイルを作成することでシナリオ試験を実施でき、多重I/Oを利用して、簡単に高負荷をかけることができます。
基本的な使い方
コマンドライン引数でコンフィグファイルを指定します。
$ internethakai scenario.yml
エラーカウントが0だった場合は、exit status 0で終了し、それ以外の場合はexit status が 1 となります。
シナリオの自動生成
以下のコマンドでシナリオを自動で作成することができます。 最初に使うときはこちらを使用してみてください。
$ hakaigen
実行時オプション
基本的にシナリオよりもコマンドライン引数での設定値が優先されます。
- -h –help
-
ヘルプを表示
- -v –version
-
バージョンを表示
- -r –max-request
-
リクエスト並列数を上書きします。
- -s –max-scenario
-
シナリオ並列数を上書きします。
- -p –max-process
-
プロセス数を上書きします。
- -l –loop
-
ループ回数を上書きします。
- -d –duration
-
持続時間を上書きします。
- -g –log-level
-
ログレベルを上書きします。
- -n –nth
-
n 番目のアクションだけを実行(0から数えます)。
- –test
-
テストモードで実行。テストモードで実行すると、強制的に並列数を1、ループ数1、1プロセス、ログレベル3で実行します。リクエストが正常に送られているか確認するために使用できます。
シナリオの基本項目
YAMLの連想配列で設定項目を指定します。指定すべきキー名について解説します。 まずは hakaigen コマンドによる自動生成を試してみてください。
- loop
-
各シナリオのループ回数を指定します。
- total_duration
-
持続時間を指定します。total_durationを設定した場合、ループ回数は無視し、一定時間シナリオの実行をつづけます。単位は秒です。
- max_request
-
HTTPクライアントの数を指定します。max_requestが10であればHTTPクライアントを10作成し、10のクライアントが同時にリクエストします。なおここで設定した値は全プロセスの合計値です。おすすめの値は “100” です(1プロセスあたり100コネクションくらいになるように調整しましょう)。
- max_scenario
-
シナリオの数を指定します。デフォルトではmax_requestと同じ値になります。特に指定の必要はありませんが、アクセスするユーザーの数を増やしたい場合に多めに設定します。たとえば、max_requestが10、max_scenarioが20であれば、20*ループ数分のシナリオを10個のHTTPクラアントが順次実行していきます。concurrencyというキー名から変更しました。
- log_level
-
ログ出力のレベルを指定します。おすすめの値は “2” です。
- 4
-
取得したhtmlの内容まで表示
- 3
-
各リクエストの詳細を表示
- 2
-
基本項目のみ表示
- encoding
-
ページの文字コード UTF-8, Shift_JIS, JIS, EUC-JP
- domain
-
ホスト名(httpを含める)
例. domian: http://example.com
- rev
-
true, false。true に設定すると、RubyRevを使用し、多重I/Oでのリクエストを行ないます。おすすめの値、true。初期値true。
- user_agent
-
リクエストに使用するUserAgent
例. user_agent: 'DoCoMo/2.0 P903i(c100;TB;W24H12)'
- show_report
-
true, false。 true にすると、結果レポートを表示します。
- save_report
-
true, false。 true にすると、結果レポートをファイルに保存します。
- log_dir
-
結果レポートを保存するディレクトリ。省略時は設定ファイルと同じディレクトリとなります。
- ranking
-
平均レスポンス、エラー率のワーストランキングを何位まで表示するか。デフォルトは10。
- timeout
-
タイムアウトするまでの秒数。デフォルトは60秒です。おすすめの値、5。
- actions
-
リクエストの内容。action のリストを指定します。後述します。
- max_process
-
破壊力をあげたい場合に設定しましょう。プロセス数を指定します。1プロセスあたり100コネクションくらいになるように調整しましょう。forkというキー名から変更しました。
例. max_process: 4
- host_name
-
基本的に指定の必要はありませんが、特別にHOSTヘッダを指定したい場合に設定してください。
actions の書き方
基本的な書き方
YAMLの配列形式で、アクション(1回のリクエストに相当)を書いていきます。
アクションは連想配列で指定します。pathというキーが必須です(アクションに文字列だけを書いた場合、pathと見なします)。
path キーにリクエストするパスを指定します。ホスト名を省略した場合は、基本項目で指定したものが使われます。
methodの値を省略した場合、GETリクエストと見なします。
例.
-
path: /index.php
POSTリクエスト
method に "POST", post_params にパラメータを指定します。
例.
-
path: /main_loadtest.php/shop/updateWithGamePoint
method: POST
post_params:
equipped: "on"
item_id: "13"
内容のチェック
scan を指定すると、該当のテキストが HTML に含まれるかどうかチェックします。
サイズのチェック
assert_size を指定すると、コンテンツのサイズが一定以上かどうかチェックします。
リダイレクトの確認
リダイレクトの確認をしたい場合は、class に RedirectCheckActionを指定してください。
assert_redirect に リダイレクト先のURLを指定します。
assert_redirect_scan を指定すると、リダイレクト先のHTMLもチェックできます(省略可能)。
例.
- path: /main.php/my/index
scan: "マイページ"
- path: /main.php/cheat/gp
class: RedirectCheckAction
assert_redirect: /main.php/my/index
assert_redirect_scan: "購入したドレス"
また、リダイレクトしないことを確認したい場合は、class に NoRedirectCheckAction を指定してください。
変数の設定
動的な変数を使用することができます。ユーザーIDなどを動的に取得したい場合に利用してください。
ファイルからランダムに取得
user_id などをファイルからランダムに取得して使用できます。
ファイルには改行区切りで、値のリストを書いておきます。シナリオごとに異なる値がセットされます。
ファイルの名前、および変数の名前は var_file、var_name というキー名でセットします。
var_file、var_name はactions の外に書きます。
例.
var_file: ./ids
var_name: user_id
actions:
# user_id がファイルからランダムに選択される
- path: /somepath?id=%(user_id)%
複数のファイルを使用したい場合は以下のように書いてください。
例.
vars:
- var_file: ./ids0
var_name: user_id
- var_file: ./ids1
var_name: item_id
actions:
# user_id と item_id がファイルからランダムに選択される
- path: /somepath?id=%(user_id)%
- path: /somepath?id=%(item_id)%
レスポンスで変数を設定
レスポンスを使って変数を設定するには、class に SetVarAction を指定します。
例.
- path: /main.php/special/person
class: SetVarAction
key: person_id
person_id というキー名にレスポンスボディの中身が設定されます。これに続くアクションのパス名やPOSTパラメーターに変数を使用できます。
<b>【重要】変数の記号を変えました</b>。
例.
- path: /main.php/hoge/index?person_id=%(person_id)%
正規表現による変数の設定
正規表現を使用して変数をセットできます(contributed by nakazawa-k)。
変数を設定するには、class に RegexpSetVarAction を指定します。
exprというキーで正規表現を使用してください。$~[1] (最後にマッチした正規表現の後方参照の部分)が変数の値となります。
例.
- path: /main.php/somepath/
class: RegexpSetVarAction
expr: 'battle_id=(\d+)'
key: battle_id
battle_id というキー名に正規表現の(\d+)の部分がセットされます。これに続くアクションのパス名やPOSTパラメーターに変数を使用できます。
例.
- path: /main.php/hoge/index?id=%(battle_id)%
WAIT
リクエストの際に、わざと少し待たせることができます。wait というキーを指定すると、リクエストを送る前に指定時間何もしないで待ちます。単位は秒です。
(この機能はスレッドモードでは使用できません)
例.
- path: /main.php/somepath/
wait: 1.5
実行時の表示
- o
-
並列数分のリクエストが終了
- x
-
タイムアウトなどエラー
- O
-
1プロセス分のリクエストが終了
高度な使い方
クラスを指定することで、挙動の詳細を変更できます。
ソーシャルアプリで使用する
client_handler に “SocialClientHandler” を指定します。
クエリパラメーターに opensocial_viewer_id というキー名で、opensocial_person_id をつけるようになります。
opensocial_id_path に opensocial_person_id のリストを書いたファイルのパスを指定すると、そちらの id を選択して使用します(ファイルは改行区切り)。
ファイルではなく、opensocial_ids というキー名で、opensocial_person_id のリストを指定することもできます。
携帯サイトで使用する(動作未検証)
client_handler に “MobileClientHandler” を指定します。
アクションごとに carrier を指定することで、ケータイキャリアを指定することもできます(1=DoCoMo, 2=KDDI, 3=SoftBank)。
uid_path に uid のリストを書いたファイルのパスを指定すると、そちらの uid を選択して使用します。ファイルは、改行区切りで、各行に、キャリアid と uid を “,” 区切りで書いてください。ファイルではなく、uids というキー名でuidのリストを指定することもできます。