基盤負荷テストを実施したので、実際の手順や困った部分などを書き留めておきます。
負荷テスト実施概要
サンプルアプリケーションを対象に、パフォーマンステスト用OSSのJMeterを使用したオンライン負荷テストを実施した。
環境
| 環境 | バージョン・概要 |
|---|---|
| Windows | 10 |
| java | openjdk 21.0.6 |
| apache-jmeter | 5.6.3 |
| アプリケーション | フロント→バック→DBの各サーバにアクセスするJSFアプリ |
オンライン負荷テスト手順
オンライン負荷テストでは、JMeterを用いて暗号化前後それぞれのテストを実施した。ベースの手順はほぼ同じなので、ここでは暗号化前の手順を記載し、暗号化後の場合の変更点等は都度追記する。
・JMeterは公式( https://jmeter.apache.org/download_jmeter.cgi )からインストール可能。javaのインストールも必要になるが、導入手順は他に取り上げてくださっている記事があるため割愛。
● x:\apache-jmeter-x.x.x\bin\jmeter.batからJMeterを起動。日本語対応。
(JMeter起動時にエラーが表示されることがあるが、その場合の対処方法はオンライン負荷テスト注意点で記載)
手順実施後のGUI版のJMeterの画面は下記のようになっている。この状態(負荷テストが実施できる状態)までの手順を以下に示す。

①スレッドグループを登録する
テスト計画を右クリック→追加→Threads(user)→スレッドグループ を追加
②記録コントローラを追加する(http(s)操作のシナリオはここに記録される)
スレッドグループを右クリック→追加→ロジックコントローラ→記録コントローラ を追加
③HTTPプロキシサーバを追加・設定する(http(s)操作のシナリオをキャプチャする)
テスト計画を右クリック→追加→Non-Testエレメント→HTTPプロキシサーバ を追加

・Grobal Settings→ポート:8080 を設定(キャプチャ開始時にJMeterが立てるプロキシサーバのポート)
・Test Plan Creation→対象となるコントローラ:テスト計画>スレッドグループ>記録コントローラ を設定し、シナリオを記録コントローラに記録させる
・HTTP Sampler settings→type:HttpClient4 を設定
※「画像はシナリオには含めないようにしたい」などの場合、除外パターンを正規表現で設定可能
Request Filtering→除外するパターン→追加→例:.*\.gif.*、.*\.css.*を追加すると、拡張子がgif、cssのものはシナリオに含まれなくなる
④ブラウザの設定から、プロキシサーバの設定を行う。シナリオキャプチャ後は設定を元に戻すため、変更前の設定をメモしておく。

例:Google Chromeの場合
設定→システム→パソコンのプロキシ設定 を開く
手動プロキシセットアップ→プロキシサーバを使う:セットアップ
プロキシサーバを使う:オン
プロキシIPアドレス:localhost、ポート:8080 を設定
「ローカルのアドレスにはプロキシサーバを使わない」:チェックを入れる
⑤③で追加したHTTPプロキシサーバから開始ボタンを押下し、シナリオキャプチャを開始する

開始ボタン押下後にCA証明書が発行された旨のポップアップが出るが、HTTPのシナリオの場合はスルーしてよい

HTTPSの場合
上記ポップアップが表示されたら、シナリオキャプチャ前に停止ボタンを押下し、x:apache-jmeterx.x.x(バージョン)\bin 配下にCA証明書(例:ApacheJMeterTemporaryRootCA.crt)が発行されているので、認証してから再度開始ボタンを押下しシナリオキャプチャを再開する(ルート証明書は別)
⑥ブラウザに移動し、実行したいシナリオの通り操作する
※ログイン・ログアウトが必要な場合は、念のためログアウトまで実行する
⑦JMeterのHTTPプロキシサーバ画面に移動し、停止ボタンを押下してシナリオキャプチャを終了する。記録コントローラ内を確認すると、キャプチャしたシナリオの各操作が1行ずつ追加されている

⑧④で変更したブラウザのプロキシサーバの設定を元に戻す
⑨記録コントローラ内のシナリオの内容を確認し、削除対象のシナリオがあれば削除する
☆静的コンテンツ(gifやcss、jpgなどの拡張子)や意図しないリクエストなどが残っている場合、負荷やスループットが想定外に増加してしまうため、基本的には削除を推奨
・最初のログインリクエストのみKeepAlive設定を外す
※一連の操作を無限ループさせたい場合は、先頭のリクエストのKeepAliveは外すとよい
⑩HTTPクッキーマネージャを追加する
スレッドグループを右クリック→追加→設定エレメント→HTTPクッキーマネージャ を追加

・「繰り返しごとにクッキーを破棄」:チェックを外す
・Cookie Policy:standard
★⑪JSF(Webアプリケーションフレームワーク)アプリの場合
先頭のリクエスト配下にCSS Selector Extractorを追加する
先頭のリクエストを右クリック→追加→後処理→CSS Selector Extractor を追加

・参照名:ViewState
・CSS Selector expression:input[name="jakarta.faces.ViewState"]
・Attribute:value
・一致番号:1
2番目以降のリクエストのパラメータ内に"jakarta.faces.ViewState"がある場合、valueを${ViewState}に変更する
⑫キャプチャしたシナリオが問題なく動作するか確認するため、結果をツリーで表示を追加する
スレッドグループを右クリック→追加→リスナー→結果をツリーで表示 を追加
⑬上部タブの開始ボタン(▷ボタン)を押下し、キャプチャしたシナリオの実行結果を確認・必要に応じてシナリオを修正する
結果をツリーで表示 から実行結果を確認し、実行時に送信したリクエストや画面の表示、ステータスを確認する
また、接続先のサーバのログからリクエストが届いているか確認するのも重要
⑭シナリオのスレッド数を調整する
スレッドグループタブに移動し、同時実行ユーザ数(スレッド数)、Ramp-up期間、ループ回数などを設定する

性能テストにおいては下記のパラメータが重要
・スレッド数:シナリオの同時実行数のようなもの。次項の定数スループットタイマと合わせて負荷を決定する
・Ramp-up期間:スレッドの起動をずらすための設定項目。100スレッドに対し10秒を設定すると、実行開始から10秒間で100スレッドが均等に立ち上がるイメージ。
※0秒などに設定すると、負荷が集中しムラが発生するため注意
・ループ回数:基本的には無限ループを使用
・スケジューラにチェックを入れ、持続時間を設定
⑮定数スループットタイマを設定する
・定数スループットタイマ:スレッド毎の単位時間あたりのリクエスト実行回数を制御する項目。これにより負荷の偏りを軽減させる。
スレッドグループを右クリック→追加→タイマ→Constant Throughput Timer(定数スループットタイマ) を追加
-ターゲットスループット:1分間の実行回数を入力(1秒間に7回の場合、420)
-Calculate Throughput based on:all active threads に設定
⑯コマンドプロンプトを起動し、シナリオを実行する
(CLIからシナリオ実行時にエラーが表示されることがあるが、その場合の対処方法はオンライン負荷テスト注意点で記載)
x:\apache-jmeter-x.x.x\bin\jmeter.bat -n -t [実行するシナリオのjmxファイル名(フルパス)] -l [結果出力ファイル(例:x:\aa\bb\mmdd_test.log)] -e -o [レポート結果出力先フォルダ(空であること/例:x:\aa\bb\mmdd_report)]
注意点
⑫のようにGUIから負荷テストを行う場合、JMeter自体の負荷がボトルネックになる可能性があるため、CLIから実行する
※公式でも説明アリ
オンライン負荷テスト性能要件
実際の負荷テストで使用したJMeterの各設定値を決定するにあたり、下記のようにアプリ側の性能要件を参照した。
なお、年率増加などはここでは考慮していない。合計値に関しては、安全を考慮しすべてのピークが重なった際の数値を算出している。
| 性能要件 | Aシステム | Bシステム | 合計 |
|---|---|---|---|
| ピーク時スループット | 1600trn/s | 440trn/s | 2040trn/s |
| ピーク時同時接続ユーザ数 | 800ユーザ | 440ユーザ | 1240ユーザ |
| 月間アクティブユーザ数(MAU) | 63万ユーザ | 813万ユーザ | 876万ユーザ |
上記性能要件から割り出した各設定値は以下のようになる。
今回の負荷テストでは冗長構成を想定し、3サーバからシナリオを実行しているため、ここで記載する設定値は1サーバ当たりのものである。
| JMeter設定項目 | 設定値 |
|---|---|
| スレッド数 | ピーク時同時接続ユーザ数(合計値)より、417件(1サーバ当たり) |
| Ramp-up期間 | 10秒 |
| ループ回数 | 無限ループ |
| 持続時間 | 180秒 |
| 定数スループットタイマ(ターゲットスループット) | ピーク時スループット(合計値)より、48000件/min(1サーバ当たり)+10000件/min |
※ 定数スループットタイマに関しては、設定値より低いスループットが実測値として計測されたため、リソース使用率にも余裕があることから、性能要件から割り出した数値に10000件/minを追加している。
オンライン負荷テスト注意点
・今回はJSFアプリだったため、CSS Selector ExtractorでViewState情報を保持しないと、シナリオを実行してもバックエンド/DBまでアクセスできなかった。アプリ仕様に注意。(テスト実施時アプリ仕様を把握できていなかったため、ここの原因追及にえらく時間がかかりました)
・⑤で示すように、HTTPS通信をキャプチャするにはHTTPプロキシサーバの証明書の取得・更新が必要
・jmeter.batから起動させる時もしくはCLIから実行時、エラーとなる場合がある
具体的なエラーメッセージは以下のような感じ
Not able to find Java executable or version. Please check your Java installation.
errorlevel=2
続行するには何かキーを押してください…
この場合、Javaの設定が不十分な場合もあるが、今回であれば「環境変数を編集」→何も変更せずOKを押す とJMeter起動/CLI実行が成功したりした
