前書き

このチュートリアルでは、Apache JMeterを使用して、Webアプリケーション環境で基本的な負荷およびストレステストを実行する方法について説明します。 グラフィカルユーザーインターフェイスを使用してテスト計画を作成し、Webサーバーに対してテストを実行する方法を示します。

JMeterは、テストをロードしてパフォーマンスを測定するように設計されたオープンソースのデスクトップJavaアプリケーションです。 さまざまなシナリオの負荷をシミュレートし、CSVファイルやXMLファイル、グラフなど、いくつかの方法でパフォーマンスデータを出力するために使用できます。 100%Javaであるため、Java 6以降をサポートするすべてのOSで使用できます。

前提条件

このチュートリアルを実行するには、JMeterを実行できるコンピューターと、負荷テストを行うWebサーバーが必要です。 負荷を処理できることがわかっている場合を除き、実稼働サーバーに対してこれらのテストを実行しないでください。実行すると、サーバーのパフォーマンスに悪影響を与える可能性があります。

このチュートリアルのテストは、独自のWebアプリケーションに適合させることができます。 例としてテストしているWebサーバーは、NYC2 DigitalOcean DatacenterのLEMPスタックでWordPressを実行している1 CPU / 512 MB VPSです。 JMeterコンピューターは、NYCのDigitalOceanオフィスで実行されています(テストの待機時間に関連しています)。

JMeterのテスト結果は、JMeterが使用できるシステムリソース(CPUとRAM)や、JMeterとテスト対象のWebサーバー間のネットワークなど、さまざまな要因によって歪む可能性があることに注意してください。 結果を歪めずにJMeterが生成できる負荷のサイズは、テストを非グラフィカルモードで実行するか、負荷生成を複数のJMeterサーバーに分散することで増加できます。

JMeterをインストールする

Apache JMeterをデスクトップアプリケーションとして使用しており、さまざまなデスクトップOSが使用されているため、特定のOSに対するJMeterのインストール手順については説明しません。 そうは言っても、JMeterは非常に簡単にインストールできます。 インストールする最も簡単な方法は、パッケージマネージャーを使用することです(例: apt-getまたはHomebrew)、または公式サイトからJMeterバイナリをダウンロードしてアーカイブ解除し、Java(バージョン6以降)をインストールします。

以下は、JMeterを実行するために*必須*アーカイブへのリンクを含むソフトウェアのリストです。

Javaのインストール方法によっては、JMeterがJavaおよびkeytoolバイナリを見つけることができるように、Java binディレクトリを `+ PATH +`環境変数に追加する必要がある場合があります。

また、JMeterをインストールしたパス(アーカイブ解除したディレクトリ)を `+ $ JMETER_HOME `として参照します。 したがって、LinuxまたはUnixベースのOSを使用している場合、JMeterバイナリは ` $ JMETER_HOME / bin / jmeter `にあります。 Windowsを実行している場合は、 ` $ JMETER_HOME / bin / jmeter.bat +`を実行できます。

参考のため、このチュートリアルを作成する際に、次のソフトウェアバージョンを使用しました。

  • Oracle Java 7 Update 60、64ビット

  • Jメーター2.11

JMeterをインストールして実行したら、テスト計画の作成に進みましょう。

基本的なテスト計画の作成

JMeterを起動すると、空の_Test Plan_のあるグラフィカルユーザーインターフェイスが表示されます。

画像:https://assets.digitalocean.com/articles/jmeter/jmeter_start.png [JMeter GUI]

テスト計画は、負荷テストのシミュレーション方法を決定する一連のテストコンポーネントで構成されます。 これらのコンポーネントの一部をテスト計画に追加する際の使用方法について説明します。

スレッドグループを追加する

最初に、スレッドグループをテスト計画に追加します。

  1. _Test Plan_を右クリックします

  2. _Add> _の上にマウスを置きます

  3. マウスを_Threads(Users)> _の上に置きます

  4. _Thread Group_をクリックします

_Thread Group_には、負荷テストに影響を与える3つの特に重要なプロパティがあります。

  • スレッド数(ユーザー):JMeterがシミュレートしようとするユーザーの数。 これを* 50 *に設定します

  • ランプアップ期間(秒単位):JMeterがスレッドの開始を配信する期間。 これを* 10 *に設定します。

  • ループカウント:テストを実行する回数。 この設定は* 1 *のままにします。

image:https://assets.digitalocean.com/articles/jmeter/thread_group1.png [スレッドグループのプロパティ]

HTTPリクエストのデフォルトを追加する

HTTP Request Defaults Config要素は、テスト計画でHTTP要求のデフォルト値を設定するために使用されます。 これは、テストの一環として同じサーバーに複数のHTTP要求を送信する場合に特に便利です。 次に、HTTP要求のデフォルトをスレッドグループに追加します。

  1. _Thread Group_を選択し、右クリックします

  2. _Add> _の上にマウスを置きます

  3. _Config要素> _の上にマウスを置きます

  4. [HTTPリクエストのデフォルト]をクリックします

[HTTP要求のデフォルト]の[Webサーバー]セクションで、[サーバー名]フィールドまたは[IP_]フィールドに、テストするWebサーバーの名前またはIPアドレスを入力します。 ここでサーバーを設定すると、このスレッドグループの残りのアイテムのデフォルトサーバーになります。

image:https://assets.digitalocean.com/articles/jmeter/http_request_defaults.png [HTTPリクエストのデフォルト]

WebサーバーがCookieを使用している場合、HTTP Cookie Managerをスレッドグループに追加することで、Cookieのサポートを追加できます。

  1. _Thread Group_を選択し、右クリックします

  2. _Add> _の上にマウスを置きます

  3. _Config要素> _の上にマウスを置きます

  4. [HTTP Cookie Manager]をクリックします

HTTPリクエストサンプラーを追加する

次に、各スレッド(ユーザー)がアクセスするページリクエストを表す_Thread Group_にHTTPリクエストサンプラーを追加します。

  1. _Thread Group_を選択し、右クリックします

  2. _Add> _の上にマウスを置きます

  3. マウスを_Sampler> _の上に置きます

  4. HTTPリクエストをクリックします

[HTTPリクエスト]の[HTTPリクエスト]セクションで、_Path_に各スレッド(ユーザー)にリクエストするアイテムを入力します。 これを「+ / +」に設定して、各スレッドがサーバーのホームページにアクセスするようにします。 HTTPリクエストのデフォルトアイテムで既に指定されているため、このアイテムでサーバーを指定する必要はありません。

*注意:*テストの一部としてさらにHTTP要求を追加する場合は、この手順を繰り返します。 すべてのスレッドがこのテスト計画のすべての要求を実行します。

テーブルリスナーにビューの結果を追加する

JMeterでは、負荷テストの結果を出力するためにリスナーが使用されます。 利用可能なさまざまなリスナーがあり、プラグインをインストールすることで他のリスナーを追加できます。 読みやすいので、テーブルを使用します。

  1. _Thread Group_を選択し、右クリックします

  2. _Add> _の上にマウスを置きます

  3. _Listener> _の上にマウスを置きます

  4. 表の結果を表示をクリックします

_Filename_の値を入力して、結果をCSVファイルに出力することもできます。

基本的なテスト計画を実行する

基本的なテスト計画が設定されたので、実行して結果を見てみましょう。

最初に、File _、 Save_の順にクリックしてテスト計画を保存し、目的のファイル名を指定します。 次に、左側のペインで[テーブルの結果を表示]を選択し、メインメニューから[実行]をクリックし、[開始]をクリックします(または、メインメニューの下にある緑色のスタート矢印をクリックします)。 テストは次のように実行されるため、表にテスト結果が表示されます。

image:https://assets.digitalocean.com/articles/jmeter/results_table1.png [テスト結果表]

結果の解釈

おそらく、すべてのリクエストのステータスが「成功」であることがわかります(緑色の三角形にチェックマークが付いていることで示されます)。 その後、おそらく最も関心のある列は、サンプル時間(ms)および_待ち時間(例には表示されていません)列です。

  • 遅延:JMeterが要求を送信してから最初の応答を受信するまでに経過したミリ秒数

  • サンプル時間:サーバーがリクエストを完全に処理するのにかかったミリ秒数(応答+待ち時間)

生成されたテーブルによると、サンプル時間の範囲は128〜164ミリ秒でした。 これは、基本ホームページ(約55 KB)の妥当な応答時間です。 例で示されているように、Webアプリケーションサーバーがリソースに苦労していない場合、サンプル時間は主に地理的距離(一般に待ち時間が増加します)と要求されたアイテムのサイズ(転送時間が増加します)に影響されます。 あなたの個人的な結果は例とは異なります。

そのため、50 KBのユーザーが55 KBのWordPressホームページに10秒(毎秒5)でアクセスするというシミュレーションを、サーバーは受け入れました。 スレッド数を増やしたときに何が起こるか見てみましょう。

負荷を増やす

80スレッドで10秒間同じテストを試してみましょう。 左ペインの[スレッドグループ]項目で、[スレッド(ユーザー)の数]を* 80 *に変更します。 [テーブルの結果を表示]をクリックし、[開始]をクリックします。 サンプルサーバーでは、次の表になります。

image:https://assets.digitalocean.com/articles/jmeter/results_table2.png [結果表2]

ご覧のとおり、サンプル時間は1秒近くまで増加しました。これは、Webアプリケーションサーバーがリクエストによって過負荷になり始めていることを示しています。 VPSにログインして、負荷テスト中のリソース使用量を簡単に見てみましょう。

SSH経由でWebサーバーにログインし、 `+ top +`を実行します。

top

サーバーに積極的にアクセスするユーザーがいない限り、Cpu(s)%ユーザー使用率(us)は非常に低いか0%であり、Cpu(s)%アイドル(id)は99%+である必要があります。そう:

image:https://assets.digitalocean.com/articles/jmeter/top_idle.png [アイドルトップ出力]

次に、* JMeter *でテストを再度開始し、WebサーバーのSSHセッションに切り替えます。 リソース使用量の増加が表示されるはずです。

image:https://assets.digitalocean.com/articles/jmeter/top_max_cpu.png [Max CPU Top Output]

この例の場合、CPU%のユーザー使用率は94%で、システム使用率(sy)は4.7%でアイドル状態は0%です。 上記の画像に示されているように、メモリが不足しているわけではないため、パフォーマンスの低下はCPUパワーの不足によるものです。 また、WordPressにサービスを提供しているphp5-fpmプロセスがCPUの大部分を使用している(合計で約96%)こともわかります。

10秒で80ユーザーのこのシミュレーションの要求を満たすには、CPUを増やすか、サーバーセットアップを最適化してCPUの使用量を減らす必要があります。 WordPressの場合、MySQLデータベース(CPUの一部を使用)を別のサーバーに移動し、キャッシュを実装することもできます(これによりCPU使用量が減少します)。

興味がある場合は、テストでスレッドの数を調整して、サーバーがパフォーマンスの低下を示す前に処理できる数を確認できます。 1 CPUドロップレットの例の場合、10秒間で72スレッドを使用するまで問題なく動作します。

結論

JMeterは、ボトルネックを減らしてパフォーマンスを向上させるために、Webアプリケーションサーバーのセットアップをどのように改善すべきかを判断するための非常に貴重なツールです。 JMeterの基本的な使用法を理解したので、さまざまなシナリオでサーバーのパフォーマンスを測定するための新しいテスト計画を作成してください。

例として使用したテストは、通常のユーザーの使用パターンを正確に反映していませんが、JMeterには、ご使用の環境で役立つ可能性のあるさまざまなテストを実行するツールがあります。 たとえば、JMeterは、ユーザーのアプリケーションへのログイン、クライアント側のキャッシュ、およびURL書き換えによるユーザーセッションの処理をシミュレートするように構成できます。 目的のシナリオの構築に役立つ組み込みサンプラー、リスナー、および構成ツールは他にも多数あります。 さらに、その機能を強化するためのJMeterプラグインがあり、http://jmeter-plugins.org/からダウンロードできます。