Asial Blog

Recruit! Asialで一緒に働きませんか?

JMeterを有効活用して精度の高い負荷テストをしよう

カテゴリ :
バックエンド(プログラミング)
タグ :
Tech
PHP
JMeter
みなさん、こんばんは。笹亀です。

アシアルのコーポレートサイトが先日、5年ぶりくらいにリニューアル致しました!
サイトもHTML5で組み直し、全面リニューアルしております。
とてもインパクトがあるサイトになっておりますので、是非、覗いて行ってください。
 http://www.asial.co.jp

本日は、JMeterについてご紹介しようと思います。
JMeterは負荷テストを行うための有名なツールですが、ヘッダー情報などの設定を自由にできることが便利です。自分がよく負荷テストをかけるときには、よくユーザ固有な情報を使った負荷テスト(例:携帯のUIDを使った操作)を考えて実施することが多いです。その手法についても一緒にご紹介させていただきます。

まずはJMeterをインストールしましょう。下記の箇所を参考にするとインストールできると思います。JMeterはインストーラーはないので、コマンドで実行することになります。
http://ogsheltie.blogspot.jp/2011/09/jmeter.html

実行コマンド例:/Applications/jakarta-jmeter-2.3.4/bin/jmeter



JMeterを起動したら、負荷テストをするために下記の情報について準備をしておきます。
1.負荷テスト用のデータ登録用テーブル作成
  1. CREATE TABLE `T_TEST` (
  2.   `id` int(20) NOT NULL AUTO_INCREMENT,
  3.   `UID` varchar(255) DEFAULT NULL,
  4.   `HEADER` text,
  5.   PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.負荷テスト用にデータ登録をするPHPを作成(jmeter_test.php
  1. <?php
  2.  
  3. $pdo = new PDO('mysql:dbname=test;host=127.0.0.1;', 'root', 'pass');
  4.  
  5. //ヘッダー情報取得(AuのUID取得
  6. $uid = $_SERVER['HTTP_X_UP_SUBNO'];
  7.  
  8. $header_text = print_r($_SERVER, true);
  9.  
  10. //DBに登録
  11. $pdo->query("INSERT INTO T_TEST VALUES('', '{$uid}', '{$header_text}')");
  12.  
  13. echo 'Insert OK';


上記で、負荷テストの準備完了です。次にJMeterのテストケースを作成していきます。
1.テスト計画を右クリックし、「追加 → スレッドグループ」を追加して、スレッド数、Ramp-Up期間、ループ回数を入力します。
 ※スレッドとしてまとまったテストケースの設定がおこなえるものです。


2.スレッドグループを右クリックし、「追加 → 設定エレメント → HTTPリクエスト初期値設定」を追加して、サーバ名ポート番号を入力します。
 ※サーバ名やポート番号などの初期値の設定ができるものです。


3.スレッドグループを右クリックし、「追加 → 設定エレメント → ユーザー定義変数」を追加して、変数を登録します。
 ※Jmeterで使用できる変数を作成することができます。

 名前:datetime 値:${__time(yyyyMMddss)}

4.スレッドグループを右クリックし、「追加 → 設定エレメント → HTTP認証マネージャ」を追加して、認証情報を登録します。
※ベーシック認証が掛かっている領域で認証してくれる仕組みです

 ※必ず、自分のテストをしたい環境に合わせて設定をしてください。

5.スレッドグループを右クリックし、「追加 → 設定エレメント → カウンタ」を追加して、カウンタ情報を登録します。
※テストを実行する度にカウントしてくれるカウンターの設定ができます。(参照名でテストで使用可能。


6.スレッドグループを右クリックし、「追加 → サンプラー → HTTPリクエスト」を追加して、テストするリクエスト情報を登録します。
※実行するスクリプトのテストケースを作成します。


7.HTTPリクエストを右クリックし、「追加 → サンプラー → HTTPヘッダマネージャ」を追加して、テストするリクエストのヘッダー情報を登録します。
※実行するスクリプトのテストケースを作成します。

ヘッダー名:x-up-subno(AuのUIDヘッダー名
ヘッダー値:stg_${datetime}${usercounter}_hb.ezweb.ne.jp
 ※3,5で登録した変数名を使用して動的に値が変更するヘッダー情報を作ります。

8.スレッドグループを右クリックし、「追加 → リスナー → 統計レポート」を追加して、テスト結果を表示するレポートを登録します。
※実行したテスト結果をレポート化するものです。


9.統計レポートをクリックした状態で「実行 → 開始」テストを実行します。




上の図は、100メソッドで5000ループするので合計50000回、実行されたことになります。スクリプト実行のエラー率や1秒あたりの処理数(スループット)などが表形式で表示されます。今回の実施結果では、エラー率は0%で1秒間に307リクエストをさばけるという結果が出ております。

レポートには統計レポートの他にもグラフなどで表示するリスナーもあります。
 ※追加 → リスナー → グラフで表示

今回のテストで一番お伝えしたかった箇所は7で設定したテストごとにユニークな情報(AuのUID)を作成する箇所です。このようにテスト毎でユニークな情報を作れれば負荷のテストケースとしても精度が高い負荷テストが行えます。負荷テストをするときには単にテストするのではなく、なるべくアクセス想定をした形で実施する方がよりよいテストと言えると思います。