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のリストを指定することもできます。