🪵

JMeterを使ってSpringbootAppを負荷テストする

2023/09/21に公開

最初に

Applicationを開発した後、予想される実際の使用量または負荷をシミュレーションして作られたApplicationの限界を確認し、改善を通じて安定的にサービスを提供する事ができるため性能をテストする必要があります。荷テストを行うと、Applicationが実際の使用シナリオでどのような性能を見せるか、同時にユーザー数が増加した時にシステムがどのように反応するかなどを確認することができ、 これを通じて問題を改善できる地点を見つけることができるようになります。この記事では、Springbootをベースに開発したWASを負荷テストツールであるJMeterを利用してテストします。

JMeterのインストールする

JMeterはApacheの公式サイトからダウンロードできます。
JMeterのパッケージをダウンロードし、解凍してインストールします。
https://jmeter.apache.org/download_jmeter.cgi

JMeterの起動

JMeterは「GUIモード」「CLIモード」「サーバーモード」の3種類のモードで起動できます。

GUIモード:テスト計画や設定、結果の分析などの際に使用します。
CLIモード:実際に負荷テストを実行する際に使用します。「負荷テストをGUIモードで実行しないでください」という注意書きが公式サイトに繰り返し書かれています。
サーバーモード:複数のホストに構築したJMeterから分散して負荷をかけたい場合に使用します。

JMeter Test Plan作成

初にJMeterを実行させると、次のように空のTest Planを見ることができます。 Test Planは負荷テストのための全体計画および構成を示すファイルで、シミュレーションしようとする負荷テストの目標、対象システムの詳細情報、シミュレーションするユーザー数、負荷テストの実行方法など多様な設定ができる。

テストを進めるためにThread Groupを生成します。 Thread Groupは特定シナリオに対する詳細を定義することができます。

hread Groupを生成すると同時に実行される仮想ユーザーの数、ランプアップ期間およびテスト持続時間などを定義することができます。

  • Number of Threads:同時に実行される仮想ユーザの数を指定します。 この数値が高いほど、システムに高い負荷をかけることができます。 ウェブアプリケーションに対する負荷テストを行う際のユーザー数を意味します。
  • Ramp-up Period:仮想ユーザが全時間同時に開始されるのではなく、一定の時間順に開始される期間を指定します。 例えば、10個のスレッドと10秒のRamp-up Periodが設定されている場合、1秒ごとに1個のスレッドが実行され、10秒後にはすべてのスレッドが実行されます。
  • Duration:テストが実行される総時間を指定します。 テストが続く間、JMeterはThread Groupで指定された数のスレッドを実行し続け、これによりシステムに対する一定の負荷を維持します。

HTTP Request Default 設定

HTTP Request Defaultを設定してHTTP要請を送る時、基本的に適用される設定を指定することができます。 これにより、ユーザーがHTTP要請を送るたびに設定を繰り返し指定する必要がなくなります。

HTTP Request Sampler 設定

テストページリストに該当するSamplerを追加する。

HTTP Request Samplerを設定して情報を呼び出します。 HTTP Request Defaultを適用したため、サーバー接続情報は省略可能でが、情報を記入すると、HTTP Requestに記入された情報が優先適用されるます。

負荷テストの結果を見る

結果を見るためにリスナーを利用することができます。

  • View Results Tree
    すべての応答データをツリー形式で表示してHTTP要請および応答を詳細に確認できるリスナーです。
    設定: Add → Listener → View Results Tree
  • Summary Report
    テスト結果を要約して簡単な統計情報を提供するリスナーとして要請件数、平均応答時間、エラー比率などの情報を確認することができます。
    設定: Add → Listener → Summary Report
  • Graph Result
    テスト結果をグラフで視覚化して表示するリスナーです。 応答時間グラフ、TPS(Total Processing Time)グラフなどを通じて性能問題を把握することができます。
    設定: Add → Listener → Graph Result

負荷テストを実行する

Ctrl+Rまたはプレイボタンを押すと負荷テストが実行します。

200人が同時接続する環境を構成してみたら、次のような結果が得られます。エラーは発生しておらず、39166件のリクエストに対して平均的に0.066秒以内に応答することが確認できます。

Graph Resultsのグラフ


"Data"、"Average"、"Median"、"Deviation"、「Throughput」は次のような意味があります。

  • Data : サンプル結果の値を示します。 例えば、応答時間グラフでは、Dataは各サンプルの応答時間値を意味します。
  • Average : サンプル結果の平均値を示します。 例えば、応答時間グラフで「Average」は、すべてのサンプルの応答時間値の平均を意味します。
    メディアン:サンプル結果値の中央値を示します。 中央値は、すべてのサンプル値をサイズ順に整列した時、真ん中に位置した値です。 例えば、応答時間グラフにおけるすべてのサンプルの応答時間値の中央に位置する値です。
  • Deviation : サンプル結果値の偏差を示します。 偏差はサンプル値と平均値の差を示します。 例えば、応答時間グラフにおけるすべてのサンプルの応答時間値とその値の平均値との間の差を示します。
  • Throughput : 単位時間あたりのスループットを示す。 例えば、毎秒要求数グラフにおいて、"Throughput"は毎秒処理される要求数を示します。 これは、システムがどれほど多くの要求を処理できるかを示し、システムのパフォーマンスを評価する上で重要な指標の 1 つです。

最後に

JMeterを活用してSpringbootAppの負荷テストを簡単に行いました。使い方を習得しておけば役に立つ場面は多いと思うので、また、詳しく勉強を進見たいを思いました。

Discussion