Webサイトへの負荷テスト(限界テスト)について記載します。
Webアプリケーションの負荷テストになるので、インフラは必須としてやWebサーバ、ミドルウェア、開発言語の知識が必要になり、テスト計画を立てる度に検討する項目の多さに頭を抱えています。
Webサーバの負荷テストでお世話になっているJMeterの使い方について記載します。
PC環境
OS: Windows 10 pro
JDK: AdoptOpenJDK 11.0.11
JMeter: JMeter 5.4.1
作業工程
No | 作業概要 | 作業内容 |
1 | JDKのインストール | JDKのダウンロードとインストール |
2 | JMeterのインストール | JMeterのダウンロードと配置 |
3 | JMeterの環境設定 | JMeterの日本語化 |
4 | ベースシナリオの作成 | JMeterにオブジェクト配置と設定 ブラウザのプロキシ設定 シナリオの実行とキャプチャ リスナーでの動作確認 |
5 | 負荷テスト用の修正 | 負荷テスト用の追加設定 |
6 | 負荷テストの実行 | 負荷テストの実施 |
7 | 結果レポートの作成 | レポートの取得 |
1.JDKのインストール
JDKがインストールされていないPCではJDKのインストールが必須になります。
個人や開発で使用するならOracle JDKで問題ありませんが、本番や商用利用は有料になりますので、JDK無償 Windowsで検索するとOpen JDKやAdoptOpenJDKが表示さるかと思いますので、ダウンロードしてインストールします。
両方ともインストールパラメータにすべてインストールを指定しておけば問題はないかと思いますが、インストール後に下記のコマンドをコマンドプロンプトから実行してJAVAの実行モジュールにパスが通っていることを確認してください。
java -version
JAVAのバージョンが表示されれば、パスは通っています。表示されない場合には環境変数のPathにJAVAをインストールしたフォルダのパスを追加する必要があります。
パスが追加されていないとJMeterの起動時にJAVAが無いとエラーが出て起動しません。
また、4GB以上のメモリがPCに搭載されている場合には64bit版のJDKをインストールしてください。
2.JMeterのインストール
JMeterをダウンロードして展開します。
JMeterダウンロードで検索するとApacheのサイトが表示されます。zipになっているJMeterをダウンロードしてzipファイルを展開します。
展開場所は特に指定はありません。デスクトップ上でも使用可能です。
3.JMeter環境設定
JMeterの標準は英語表記になっています。
英語表記で問題なければそのままでもよいのですが、日本語表示の設定方法を記載しておきます。
起動させたJMeterから[Option]→[Choose Language]から[Japanese]を選択してもよいのですが、JMeterを再起動すると英語表示に戻ってしまうため、[jmeter.bat]ファイルを編集して標準を日本語設定にします。
74行付近のパラメータを修正します(赤字部分)。
変更前
if not defined JMETER_LANGUAGE (
rem Set language
rem Default to en_EN
set JMETER_LANGUAGE=-Duser.language=”en” -Duser.region=”EN”
変更後
if not defined JMETER_LANGUAGE (
rem Set language
rem Default to en_EN
set JMETER_LANGUAGE=-Duser.language=”ja” -Duser.region=”JP”
4.ベースシナリオの作成
4.1 オブジェクトの配置
apache-jmeter-5.4.1¥binフォルダのjmeter.batをダブルクリックしてJMeterを起動します。
[テスト計画]→[追加]→[Threads(Users)]→[スレッドグループ]でスレッドグループを追加します。
[スレッドグループ]→[追加]→[ロジックコントローラー]→[記録コントローラ]で記録コントローラを追加します。
[テスト計画]→[追加]→[Non-Testエレメント]→[HTTPプロキシサーバ]でHTTPプロキシサーバを配置します。
ここまでの配置画面(下図)
4.2 HTTPプロキシサーバの設定
対象とする記録コントローラの設定
[HTTPプロキシサーバ]の[Test Plan Creation]タブにある「対象となるコントローラ」に前項で作成した記録コントローラを設定します。HTTPプロキシサーバがパケットキャプチャする対象になるので、忘れないように注意してください。
記録の対象となるWebサーバのFQDNを記載
[HTTPプロキシサーバ]の[Requests filtering]タブにある[挿入するパターン]にテスト対象となるドメインを正規表現で登録します。
例:abc.efg.co.jpの場合、下記のように正規表現で記載する必要があります。
挿入するパターンに直接記載するとなぜか追加ボタンを押しても空白が登録されるので、テキストエディタに記載した内容をコピーして[Add from Clipboard]ボタンで登録してください。
*abc\.efg\.co\.jp.*
キャプチャするURLを登録後の画面
尚、[挿入するパターン]が空白な場合は、すべてのWebサイトをキャプチャします。
キャプチャが出来ない場合には、とりあえず空白にしてキャプチャをテストすることも可能です。
除外するパターンの登録
[HTTPプロキシサーバ]の[Requests filtering]タブにある[除外するパターン]にテスト対象となる対象を記載します。
負荷テストの場合、静的コンテンツは取得しても意味はないので取り込みから場外してやります。こうすることで、余計なキャプチャが減ります。
以下の拡張子は一般的に静的コンテンツに使用されるので、除外を推奨します。
やはり[Add from Cloipboard]で登録することをお勧めします。
.*\.js.*
.*\.gif.*
.*\.svg.*
.*\.css.*
.*\.jpg.*
.*\.woff2.*
.*\.ico.*
.*\.png.*
.*\.woff.*
.*\.ttf.*
JMeterのプロキシサーバの起動
[HTTPプロキシサーバ]の[開始]ボタンをクリックし起動を確認します。
初期設定ではTCPポート8888で起動するので、他のアプリケーションが当該ポート(TCP:8888)を使用しているなど不都合がある場合には任意のポートに変更することも可能です。
4.3 ブラウザのプロキシ設定
前項で起動したHTTPプロキシサーバをWebブラウザが使用するように設定を変更します。サンプルとしてChromeの画面を紹介します。
Chromeの[設定]→[詳細設定]→[パソコンのプロキシ設定を開く]でWindowsのプロキシサーバ設定画面を開き手動プロキシセットアップのアドレスに[127.0.0.1]、ポートに[8888]を入力します。
4.4 シナリオのキャプチャ
ここまでのセットアップが完了しましたら、実際にWebブラウザからテスト対象のページにアクセスします。
HTTPSサイトへのアクセス
上記の画面が表示された場合、対象Webサイトはサーバ証明書により暗号化されているサイト(https://)です。この場合、JMeterの証明書をブラウザにインポートしてください。
証明書のインポート
ChromeにJMeterの証明書をインポートします。
Chromeの「設定」から画面左側の「プライバシーとセキュリティ」を選択し、表示された画面の「セキュリティ」をクリックします。
次の画面で「証明書管理」をクリックします
証明書の画面が起動しますので、[信頼されたルート証書署]タブで[インポート]を
実行してください。
インポートする証明書はJMeterのbinフォルダ内にある証明書ファイルを指定してください。
インポートの確認を促す注意ウィンドウで[Yes]を選択し、「証明書がインポートされました」ウィンドウが出たら[OK]をクリックして完了します。
尚、負荷テスト終了時(プロジェクト終了時)にJMeterの証明書はセキュリティ上望ましい状態ではないので、削除することをお勧めします。
Webサイトへのアクセス
再度Webサイトにアクセスします。
HTTPプロキシサーバの起動を忘れないでください。
JMeterの記録コントローラは以下に記録が始まればキャプチャが出来てきます。
キャプチャ成功の画面
キャプチャが成功したら名前をわかりやすい名称に変更します。
右ペインの[名前:]を変更すると記録コントローラしたの名称も変更されます。
Excelなどでレポートを加工したい場合は、日本語での名前は避けることを推奨します。
今回はWebメールのサーバにアクセスしていますので、下図のようなキャプチャがとれました。
最後の選択した行はログアウト後のトップ画面なので、右クリックで削除をしておきます。ここまでのベースシナリオを一旦保存します。
JMeterの[ファイル]→[名前を付けて保存]を選択し、適当な場所にJMeterのファイル(.jmx)を保存します。
また、HTTPプロキシーサーバを停止します。
リスナーでの動作確認
リスナーを登録して作成したシナリオが負荷テストに使用できるか確認します。
記録コントローラの下にリスナーを登録し、動作を確認します。
[追加]→[リスナー]→[結果をツリーで表示]
シナリオの実行
シナリオを実行します。
JMeterの[実行]→[開始]
上図のようにすべてグリーンのアイコンが表示されればシナリオは成功です。
シナリオの保存
フロッピーディスクのアイコンまたは、[ファイル]→[テスト計画を保存]でシナリオを保存します。
5.負荷テスト用の修正
負荷テストを実施のために設計する事項は以下の通りになります。
・タイマ
・ スレッド数とRamp-Up期間、ループ回数
・ サンプラーエラー後のアクション
・ リスナーの無効化
JMeterのスレッドグループにスレッド数、Ramp-Up期間、ループ回数を設定します。
スレッド数、Ramp-Up期間、ループ回数の動作概要は下図のようになります。
サンプルとしてスレッド数10、Ramp-Up期間5、ループ回数3を設定した画面は下図になります。
[サンプラーエラー後のアクション]の動作は下表になりますので、任意に設定します。
続行 | エラー発生しても現在のスレッドの次のテストを実行する |
Start Next Thread Loop | 現在のスレッドは終了して次のループを開始する |
スレッド停止 | 現在のスレッドは停止する。他のスレッドは停止しない |
テスト停止 | テストを停止する。テスト中のサンプラーは終了するまで待つ |
Stop Test Now | 他のスレッドのテストについても即時停止する |
リスナーの無効化
メモリ消費が大きいため、本番の負荷テストはCUIで実行する必要があります。また、リスナーでの実行結果取得も負荷が大きいため、リスナーは無効化しておきます。
ここまでが完了したら、フロッピーディスクのアイコンまたは、[ファイル]→[テスト計画を保存]でシナリオを保存します。
6.負荷テストの実行
負荷テストはCUIで実施します。
公式に推奨されており、GUIでの負荷テストはPCに負担が大きいため正確な結果が得られないと説明されています。
JMeterコマンドの主なオプションは以下の表になります。
オプション | 説明 |
n | JMeterを非GUIモードで起動 |
-t [ファイル名] | テスト計画のjmxファイル名を指定 |
-l [ファイル名] | テスト結果を格納するjtlファイル名を指定 |
-j [ファイル名] | JMetterの実行ログファイル名を指定 |
-g [CSVファイル名] | (テストは実行せずcsvファイルを読み込んで)レポートを 出力する |
-e | 負荷テスト後にレポートを出力する |
-o [フォルダ名] | レポートを出力するフォルダを指定する。存在しないフォルダ名か空のフォルダを指定する制限がある |
参考にテスト用に作成したjmxファイルを下記のコマンドで実行します。
JMeter.batがあるファイルにカレントを移動しておくことを推奨しますが、環境変数のPathが設定されていれば、どこの位置からでも実行可能です。
[JMeterフォルダ]¥bin¥jmeter -n -t [テスト用.jmx] -l [出力ログファイル.jtl]
負荷テストtest.jmxを実行し、test.jtlにログ出力するサンプルは下記になります。
※JMeterのbinフォルダに環境変数のpathを設定済
>jmeter -n -t test.jmx -l test.jtl
実行結果は下記になります。
負荷テストの停止方法
巨大な負荷テストを実行させてしまい、ネットワークに影響が発生させたことがあります(WANでは起きないとも限りません)。コマンドプロンプトをアクティブウィンドにして。ctrl+cで終了可能ですので、紹介しておきます。
余談ですが、負荷テストは内緒で実施せず必ず関係者に周知してください。
結果の確認
JMeterの結果ファイル(.jtlファイル)からレポートを作成する手順について記載します。
結果をCSVファイルに変換し、Microsoft Excelで編集する手順を記載します。
JMeterを起動します。[テスト計画]で右クリックし、リスナーから[Summary Report]を選択します。
[Summary Report]から[参照]ボタンをクリックし、結果ファイルを読み込みます。
結果ファイルを読み込むと[Summary Report]にテスト結果がリストされます
下部の[Save Tabele Data]を選択します。
CSVファイルに変換されるので、パスとファイル名を指定します。
この作業でcsvファイルが作成されますが、Labelに日本語が使用されておりますとExcelにインポートした時点で文字化けします。
文字化けを修正する場合、CSVファイルをテキストエディタで開き、ANSIまたはSHIFT-JIS形式で保存すると文字化けが解消される場合があります(改行コードはCR+LF)
可能ならばラベルになる名称は予め英語表記にしておくか、Excelでレポート作成時に整理してください。
作成したCSVファイルをExcelにインポートし、グラフ作成等、任意の加工します。
長いですが、イントロダクションとしてここまでは必要になります。
当然のように、上手くいかないケースもありますのでそのあたりの対処ケースもおいおい記載できたらと考えています。