Apache jMeter を使ったウェブサイトの負荷テストの手順を一通り紹介します。
今回の紹介するシナリオでは、以下の目的および前提でテストを行います:
(1) ウェブサイトは(一応)完成している
(2) ユーザーの想定挙動(「トップページを見て、検索をして、検索結果ページをいくつか閲覧して、・・」という導線)は決まっている
(3) 1つのページあたりのユーザーレスポンスタイム(ユーザーがそのページを開き始めてから反応が返り切るまでの時間)を3秒以内にしたい
(4) この条件で、1秒あたりに何ユーザーのアクセスまで耐えられるシステムなのかを測定したい
アプリケーションのテストには色々な種類がありますが、今回は上記のように「どれだけのユーザーアクセスにまでは耐えうるシステムなのか」を検証するテストを行います。そしてそのようなテストではこの Apache jMeter は便利です。
まずは Apache jMeter をインストールします。jMeter は Pure Java アプリケーションのため、前提として Java の実行環境が必要になります。JRE または JDK を導入して、実行可能な状態にしておいてください。その上で公式サイトから Apache jMeter の最新版バイナリをダウンロードし、展開します。展開後、jMeter の起動ファイル(Windows であれば bin/jmeter.bat)を実行して、jMeter を起動します:
次に、このテスト計画にスレッドグループを追加するのですが、その前に今回のテスト目的をおさらいします。一覧のページビューにおいて、そのユーザーレスポンスタイムを3秒(この数字は変更しても構いません)以内にする前提で、1秒あたりに何ユーザーのアクセスまで耐えられるシステムなのかを測定したい、というものでした。
というわけで、今回のテストでは、あるユーザーシナリオを元に、最初は1ユーザーで実行、次に2ユーザー同時に実行、その次は3ユーザー同時に、、、、と少しずつユーザー数を増やしていきながら、(例えば)20ユーザー同時にアクセスするところまでを実行して、それぞれのページビューアクションでのレスポンスタイムを計測する、という流れになります。そして(今回の場合であれば)3秒以内のレスポンスを期待できるのは何ユーザー程度の同時アクセスまでか、を調べることになります。
つまり今回のテストでは最初は1ユーザーでアクセスし、1分後に1ユーザー増やして2ユーザーでアクセス、更に1分後に1ユーザー増やして3ユーザーでアクセス、、、といった具合に1分ごとにユーザー数(ユーザースレッド)を増やして負荷を加えていきます。そして開始から19分後に20ユーザーでの同時アクセスとなり、ここでのレスポンスタイムを計測して終了、というテストを行います。 なお、1ユーザー増やすタイミングを1分後にする必要はありませんが、後から結果を確認しやすい(開始から何分経過したかで何ユーザーでのアクセスかを推測できる)のでこのようなテストシナリオにしています。
ではこのテストシナリオに従ってスレッドグループを定義します。jMeter の「テスト計画」と書かれた箇所を右クリックして、 追加 > Threads(Users) > スレッドグループ を選択します:
テスト契約の下にスレッドグループが追加されます。これをクリックして選択し、以下の内容を入力します:
スレッド数: 20
Ramp-Up期間(秒): 1200
ループ回数: 無限ループ
スレッド数はユーザー数です、なので20。Ramp-Up はこの20スレッドをどれだけの時間かけて生成するか、という期間の数字です。今回は1分毎に1スレッドずつ、20スレッドまで増やしていくので 60 x 20 = 1200(秒)を指定します。そして各スレッドは無限に処理を繰り返し実行してほしいので、ループ回数は「無限ループ」を指定しています。
次に、各ユーザースレッドで実行する内容を定義します。「スレッドグループ」を右クリックして、 追加 > サンプラー > HTTPリクエスト を選択します。
HTTP リクエストが追加されたら、その中身を実際のテストシナリオに合わせて変更します:
名前: 何のアクションが分かる名前に変更(どのアクションに時間がかかっているのかを区別できるように)
サーバー名: テスト先アプリケーションサーバー
ポート番号: テスト先アプリケーションサーバーのポート番号(80の場合は省略可)
パス: アクセスする URL のサーバー名以降の部分
HTTP リクエスト1つがユーザーの1回のアクセスを定義します。「このページを見て、次にこのページを見て、その次にこのページを見て、・・」のように複数のページを巡回するシナリオで計測する場合は、必要なだけこの HTTP リクエストをスレッドグループに追加していきます。この例では4つのページを巡回するシナリオを定義しています:
テストシナリオの定義はこれで終わりです。最後に結果を一覧表で確認できるようにします。スレッドグループを右クリックして 追加 > リスナー > 結果を表で表示 を選択します:
これで最小限必要な設定ができたので、メニューから ファイル > テスト計画を保存 を選択して、このテスト計画を保存します。
テストの実行はメニューから 実行 > 開始 を選択するだけです。実行中に「結果を表で表示」をクリックすると、次々に実行されるテストの結果を参照することができます:
この "Sample Time(ms)" 列が各アクションのレスポンスタイムになります。スレッドが増えていった時にこの数値がどのように増えていくのかを参照することで(今回の例であれば3秒以内に収まっているかどうかを確認することで「どの程度の同時アクセス数までは期待通りのパフォーマンスを維持できているか」を調査していくことになります。
今回の紹介するシナリオでは、以下の目的および前提でテストを行います:
(1) ウェブサイトは(一応)完成している
(2) ユーザーの想定挙動(「トップページを見て、検索をして、検索結果ページをいくつか閲覧して、・・」という導線)は決まっている
(3) 1つのページあたりのユーザーレスポンスタイム(ユーザーがそのページを開き始めてから反応が返り切るまでの時間)を3秒以内にしたい
(4) この条件で、1秒あたりに何ユーザーのアクセスまで耐えられるシステムなのかを測定したい
アプリケーションのテストには色々な種類がありますが、今回は上記のように「どれだけのユーザーアクセスにまでは耐えうるシステムなのか」を検証するテストを行います。そしてそのようなテストではこの Apache jMeter は便利です。
まずは Apache jMeter をインストールします。jMeter は Pure Java アプリケーションのため、前提として Java の実行環境が必要になります。JRE または JDK を導入して、実行可能な状態にしておいてください。その上で公式サイトから Apache jMeter の最新版バイナリをダウンロードし、展開します。展開後、jMeter の起動ファイル(Windows であれば bin/jmeter.bat)を実行して、jMeter を起動します:
次に、このテスト計画にスレッドグループを追加するのですが、その前に今回のテスト目的をおさらいします。一覧のページビューにおいて、そのユーザーレスポンスタイムを3秒(この数字は変更しても構いません)以内にする前提で、1秒あたりに何ユーザーのアクセスまで耐えられるシステムなのかを測定したい、というものでした。
というわけで、今回のテストでは、あるユーザーシナリオを元に、最初は1ユーザーで実行、次に2ユーザー同時に実行、その次は3ユーザー同時に、、、、と少しずつユーザー数を増やしていきながら、(例えば)20ユーザー同時にアクセスするところまでを実行して、それぞれのページビューアクションでのレスポンスタイムを計測する、という流れになります。そして(今回の場合であれば)3秒以内のレスポンスを期待できるのは何ユーザー程度の同時アクセスまでか、を調べることになります。
つまり今回のテストでは最初は1ユーザーでアクセスし、1分後に1ユーザー増やして2ユーザーでアクセス、更に1分後に1ユーザー増やして3ユーザーでアクセス、、、といった具合に1分ごとにユーザー数(ユーザースレッド)を増やして負荷を加えていきます。そして開始から19分後に20ユーザーでの同時アクセスとなり、ここでのレスポンスタイムを計測して終了、というテストを行います。 なお、1ユーザー増やすタイミングを1分後にする必要はありませんが、後から結果を確認しやすい(開始から何分経過したかで何ユーザーでのアクセスかを推測できる)のでこのようなテストシナリオにしています。
ではこのテストシナリオに従ってスレッドグループを定義します。jMeter の「テスト計画」と書かれた箇所を右クリックして、 追加 > Threads(Users) > スレッドグループ を選択します:
テスト契約の下にスレッドグループが追加されます。これをクリックして選択し、以下の内容を入力します:
スレッド数: 20
Ramp-Up期間(秒): 1200
ループ回数: 無限ループ
スレッド数はユーザー数です、なので20。Ramp-Up はこの20スレッドをどれだけの時間かけて生成するか、という期間の数字です。今回は1分毎に1スレッドずつ、20スレッドまで増やしていくので 60 x 20 = 1200(秒)を指定します。そして各スレッドは無限に処理を繰り返し実行してほしいので、ループ回数は「無限ループ」を指定しています。
次に、各ユーザースレッドで実行する内容を定義します。「スレッドグループ」を右クリックして、 追加 > サンプラー > HTTPリクエスト を選択します。
HTTP リクエストが追加されたら、その中身を実際のテストシナリオに合わせて変更します:
名前: 何のアクションが分かる名前に変更(どのアクションに時間がかかっているのかを区別できるように)
サーバー名: テスト先アプリケーションサーバー
ポート番号: テスト先アプリケーションサーバーのポート番号(80の場合は省略可)
パス: アクセスする URL のサーバー名以降の部分
HTTP リクエスト1つがユーザーの1回のアクセスを定義します。「このページを見て、次にこのページを見て、その次にこのページを見て、・・」のように複数のページを巡回するシナリオで計測する場合は、必要なだけこの HTTP リクエストをスレッドグループに追加していきます。この例では4つのページを巡回するシナリオを定義しています:
テストシナリオの定義はこれで終わりです。最後に結果を一覧表で確認できるようにします。スレッドグループを右クリックして 追加 > リスナー > 結果を表で表示 を選択します:
これで最小限必要な設定ができたので、メニューから ファイル > テスト計画を保存 を選択して、このテスト計画を保存します。
テストの実行はメニューから 実行 > 開始 を選択するだけです。実行中に「結果を表で表示」をクリックすると、次々に実行されるテストの結果を参照することができます:
この "Sample Time(ms)" 列が各アクションのレスポンスタイムになります。スレッドが増えていった時にこの数値がどのように増えていくのかを参照することで(今回の例であれば3秒以内に収まっているかどうかを確認することで「どの程度の同時アクセス数までは期待通りのパフォーマンスを維持できているか」を調査していくことになります。
コメント
コメント一覧 (7)
とありますが、19分後には初めのスレッドは処理済みで結果「20人同時アクセス」の負荷は得られないかと思うのですが、いかがでしょうか?
負荷試験初心者なので検討違いであれば申し訳ありません。
宜しくお願いします。
この例の場合ですが、「ループ回数=無限」の設定にしています。要は最初のユーザーは与えられたシナリオを最後まで実行したら、そのまま最初に戻ってテスト2周目に入り、それを無限に(明示的にテストを止めるまで)ずっと続ける、という設定になっています。
そのようなユーザーを1分ごとに増やしていく、という設定なので19分後には20人アクセス状態が達成できる、という内容でした。
わかりにくい説明になっておりましたら失礼しました。
お返事ありがとうございます!
ずっと勘違いしたまま進めるところでした。
スレッド数: 6
Ramp-Up期間(秒): 60
ループ回数: 無限
今迄だと上記は0~10秒で1スレッド生成、10~20秒で1スレッド作成となり、初めのスレッドは処理が完了していて10~20秒では結果1スレッドしかないのだと思っていました。
実際は、0~10秒は1スレッド、10~20は2スレッド、20~30は3スレッド、30~40は4スレッド、40~50は5スレッド、50~60は6スレッドというのが正解なのですね。
ここで質問させて頂きたいのですが、
スレッド数: 6
Ramp-Up期間(秒): 60
ループ回数: 2
の場合は
0~10で1スレッド、10~20で2スレッド、20~30で2スレッド、30~40で2スレッド、40~50で2スレッド、50~60で2スレッド
ということになりますか?
例えばですが、テストシナリオ一周が4秒で終わってしまう場合ですと、
最初(0秒)に1スレッド作られて実行され、4秒経過時点で一周目終了。そのまま二周目に入って8秒経過時点で二周目が終了します。「ループ回数=2」なので、ここでこのスレッドは御役目終了となり、稼働スレッド数はゼロになります。
10秒経過したタイミングで2つ目のスレッドが作られて実行されます。この時点で他のスレッドは動いていないので、同時に動いているスレッドはこの1つだけです。
同様にしてこの2つ目のスレッドは16秒経過時点で終了し、20秒経過時点で3つ目のスレッドが・・・という感じです。つまりこの場合だと同時には常に1スレッドしか動かないことになります。
一方、テストシナリオ1周に10秒かかるようなテスト内容だったとすると、1つのスレッドは2周して20秒間生き続けることになるので、コメントいただいたような、
> 0~10で1スレッド、10~20で2スレッド、20~30で2スレッド、30~40で2スレッド、40~50で2スレッド、50~60で2スレッド
となります。
#要は上記設定はスレッドが生成されるタイミングだけを決めているのであって、生成されたスレッドがどのくらいの期間動き続けるのか、によって同時に何スレッド動くか、は変わってくるのでした。
そもそもスレッドがどのくらいの時間で処理されるかを意識していませんでした。
1スレッドの処理時間を計ってそれによってシナリオを作っていくという基本がわかっていませんでした。
引き続き負荷テストの勉強頑張っていきます。
また宜しくお願い致します。
お世話になっております。
以前アドバイス頂いたおかげで理解が深まりました。
もう2点ご質問させて頂きたく思います。
1.
単発1000ms程度かかるスレッドにおいて
スレッド数: 20
Ramp-Up期間(秒): 200
ループ回数: 無限
で実行した場合、200秒あたりで20番目のスレッドを立ち上げた後はどうなるのでしょうか?
自分の考えでは200秒以降はずっと20人同時接続がずっと続くと考えています。
(1→2→3→・・・・・・・・・・18→19→20→20→20→20→20→・・・・・・。)
2.
jmeterサーバというものを2台用意し、jmeterクライアントから実行を行った場合、通常の2倍の処理が実行されるのですが、集計の方はどうしたら宜しいでしょうか?
スレッド数: 1
Ramp-Up期間(秒): 1
ループ回数: 1
の場合2個リクエストが同時に飛ぶので、どういったテストを行い集計を行えばよいか教えて頂きたく思います。ざっくりとした質問で申し訳ありません。
度々申し訳ありませんがご教授頂けたら幸いです。
以上、宜しくお願い致します。
〉無名のエンジニアさん
のコメントが気になったので、お節介ですがコメントさせていただきます。
スルーして頂ければ幸いです。
1については、200秒以降は停止すればいいと思います。
必要なデータ(Sample Time)は、手に入っているので、
必要以上にhttpサーバ等に負担をかけるのは好ましくないという点からも
早急に停止するのが望ましいと思います。
2については、人間から見て同時でも、
計算機から見たときには、同時でないことが多い上に、
ループ回数が1回では、サーバ上で、同時に要求が実行されているかどうかは
誰も保証できないと思います。
そういう問題が解決されていれば、logファイルを結合して、
Start Timeでソートすれば、
レスポンスタイムであるSample Timeを検討することで、
目的は達成できると思います。