今回開発するWebシステムの利用ユーザ数が意外と多いことが分かったので、久々にWebシステムの負荷試験(ストレステスト)をやってみます。
Webシステムの性能テストといえば、昔からApacheのJMeterが有名で私もよくお世話になりました。
JMeterってなに?
JMeterというのはWebシステムをテストするツールの一つです。
JMeterは、人がブラウザを使ってWebサイトを表示したり、Webシステムに使ったりする部分を自動化できるツールです。
人間では操作できないような速さでリクエストを送ることができるので、多人数が一気にシステムを利用する状況を擬似的に作ることができ、高負荷時でもシステムがきちんと動作するのか確認することができます。
Webシステム開発などでは、性能試験フェーズでこのようなツールを使ってアクセスが集中しても問題なくシステムが動作するかテストします。この負荷テストをしておかないと、いざ本番オープンした時に過負荷に耐えきれず応答速度が遅くなったり、最悪エラーで応答しないトラブルが発生することもあります。
Webシステム開発シーンでは、性能試験フェーズでこのようなツールを使ってアクセスが集中しても問題なくシステムが動作するかテストするよ。
この負荷テストをしておかないと、いざ本番オープンした時に過負荷に耐えきれず応答速度が遅くなったり、最悪エラーで応答しないトラブルが発生してシステム障害になってしまうんだ。
JMeterの気に入っているところをいくつか書きます。
参考までに今回の記事を書くのにあたって使った環境とソフトウェアのバージョンについて記載しておきます。
JMeterのセットアップ
JMeterの入手
Apache JMeterの公式サイトからダウンロードします。
バージョンは最新のものでよいでしょう。
apacht-jmeter-バージョン番号.zip をダウンロードしてZIPファイルを適当な場所に展開します。2021/01/04時点では、5.4が最新バージョンです。
JMeterの起動
JMeterを起動するには、binフォルダの中にあるjmeter.batファイルをダブルクリックします。
起動するとこのような画面が表示されます。昔はメタルっぽいGUIでしたが、今はダークモードがデフォルトなんですね。なんだか時代を感じます。
JMeterを日本語表示にする
私は画面の文字が英語だとやる気が削がれてしますので、まずは日本語表示にします。JMeterは多言語対応しているので日本語パッチとかを当てる必要はありません。
次のようにOptionから言語を選択できます。私は迷わずJapaneseです。
これで日本語表示に切り替え完了です。Toolsだけは微妙に対応していないようです。
HTTPリクエストを飛ばす
さて、いよいよJMeterを使ってWebアクセスしてみます。この手のテストツールで外部サイトへ接続するのはご法度ですので、自分のパソコン上にWebサーバを立ち上げて、そこに対してリクエストを飛ばして確認してみたいと思います。
とりあえずindex.htmlだけあれば試せますが、せっかくこの前私が学生時代に作っていたホームページの資材を発掘したので、それをターゲットにしてみたいと思います。
自分が構築したWebサイトやWebシステムに対して実施することは問題ありません。そのためのツールですから。
ちょっと試してみたいという方は自分のパソコンにWebサーバを立てて動かす方法がありますので、紹介しておきます。
テスト計画の作成
テストの内容を記録するため、まずはテスト計画を作成します。
テスト計画に名前を付けます。今回は単発でHTTPリクエストを飛ばす計画なので、「単発リクエスト」にしました。
コメント欄は補足説明を記載できます。テストケース番号などを記載しても良いですし、テストの概要を記載するのもよいでしょう。
似たようなテストシナリオを量産する場合は、後でわからなくなることが多いのでしっかりと記載しておくことをオススメします。今回は空欄にします。
スレッドグループの作成
まずは、スレッドグループを作成します。このグループが一連のWeb画面の操作の流れになります。オンラインバンキングなどで例えると、次のような流れをこのスレッドグループ内に作成します。
- ログイン
- トップ画面
- 残高表示
- 入出金一覧表示
- 入出金一覧から詳細画面表示
- ログアウト
次のような画面が表示されます。
いろいろな動作を指定できますが、奥が深いので今回はデフォルトのままでいきます。
HTTPリクエストの作成
次にいよいよHTTPリクエストを作成します。これがブラウザを操作するのと同じ動きができます。
どんなHTTPリクエストを飛ばすのか定義します。
- 名前はどんなリクエストをするのかわかりやすいものを付けます。
- プロトコルはhttpかhttpsです。今回はテスト用のWebサーバで暗号化していないものを使うため、httpを指定します。
- GETを選択します。
- サーバ名またはIP欄には、ブラウザアクセス時と同様に localhost を指定し、パス欄にURLからホスト名またはIP以外の部分を入力します。
これでトップ画面にアクセスするHTTPリクエストは完成です。
リスナーの作成
HTTPリクエストができたら、次はそのリクエストの結果を受け取るリスナーを作成します。
結果をツリーで表示を選択してスレッドグループに追加します。
テストシナリオの確認
簡単ですが、これでWebサイトのindex.htmにアクセスして、その応答を受信するというシンプルなシナリオが完成しました。
スレッドグループにこのような形でオブジェクトが追加されていれば完成です。
リクエスト送信
さあ、次はテスト実行です。①の緑三角ボタンをクリックすると、シナリオが実行されます。うまく実行されると、②の部分に実行結果が表示されます。
テストシナリオを実行すると、結果をツリーで表示の画面に結果が表示されます。
緑のアイコンの場合は成功。赤のアイコンの場合は失敗です。
レスポンス確認
①の結果をクリックすると、リクエスト結果のサマリーが表示されます。ここではリクエストを送信した時間、送受信したデータサイズ、Webサーバからレスポンスコードなどを確認できます。
リクエストタブをクリックすると、実際に発行したHTTPリクエスト文字列やデータが確認できます。
応答タブをクリックすると、リクエストに対するレスポンスのHTMLが表示されます。
さらにレスポンス表示方法もいくつかあり、私がよく使うのは、①のプルダウンを開いて②の「HTML (downloaded resources)」です。
この表示モードだと、実際にHTMLを表示してくれるので、ブラウザで実行した時の見え方を再現してくれます。一部スタイルシートが適用されず表示崩れが起きることもありますが、重宝してます。
負荷をかけてみる
それではJMeterの目的であるWebサーバ、Webシステムに負荷を掛けていくことにします。やり方は簡単で、先程作ったスレッドグループのスレッドプロパティを変更するだけです。
スレッドグループのプロパティで設定する
この3つのプロパティを変更すれば負荷テストができます。
- スレッド数:スレッドグループをいくつ起動するか
- Ramp-Up期間(秒):何秒かけて指定されたスレッド数を起動するか
- ループ回数:このテストを何回繰り返すか
それぞれの説明は次回にします。今回はとりあえず負荷を掛けたいので、スレッド数を10に変更してテストを実行してみます。
すると、このように10回アクセスしてすべて正常に終了しています。
スレッド起動数を増やして負荷を高める
これぐらいは余裕みたいですね。では、もっと負荷を高めていきましょう。実際に負荷もかかってます。
スレッド数を増やして行って確認したところ、私の環境では1,000スレッド同時実行すると、途中からエラーになりました。つまり1,000アクセスが集中すると応答できないWebシステムということになります。
今回は手っ取り早くエラーを出したかったのでWebサーバのコネクション数を少なくしてエラーを発生させたよ。エラー内容がHttpHostConnectExceptionになってるね。
負荷の掛け方を変えてみる
一気に1,000アクセスすると途中からエラーが発生しましたが、これを同時ではなく少しゆとりをもたせたらどうなるでしょうか?
例えば、1,000スレッドを同時に起動するのではなく、5秒間の間に1,000スレッドを起動するように変えてみます。つまり秒間200アクセスです。この設定で実行する場合は、Ramp-Upの値を1から5に変更します。
これで再度実行してみます。
おおお、1,000リクエストすべて正常に応答できました。
このような形でテストシナリオを作成したら、システムの性能要件に合わせてスレッドグループの値を調整することで様々な負荷状態を作って検証します。
これを繰り返すことで、Webシステムが問題なく稼動するか検証することができます。
まとめ
今回はトップページだけのシナリオでしたが、これが複雑な画面遷移だったら・・・と考えるとシナリオの作成も面倒ですよね。簡単にシナリオを作る方法などまだいろいろありますので、気が向いたら書きたいと思います。
コメント
jmeter.batと同じフォルダにsetenv.batというファイルを、下記内容で作成しておくと日本語で起動できます。
set JMETER_LANGUAGE=-Duser.language=”ja” -Duser.region=”JP”
OGHIさん
おお!
できましたーー
起動する度に言語変更していたので、
いきなり日本語で起動するの感動です\(^o^)/
起動バッチ内でsetenv.batがあるならcallするようになっていたんですね。
有益な情報ありがとうございました
記事の方もアップデートさせて頂きました