この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
はじめまして!
そろそろ2年目エンジニアのDaokaです。
今回は、私が性能・負荷テストを行うときによく使うJMeterというツールを紹介したいと思います。
JMeterとは?
jakartaプロジェクトで作られている、Webアプリ向けの性能・負荷テストツールです。無償でありながら、かなり高性能で複雑なテストシナリオを作成・実行することができます。
また、Javaの実行環境があればどのWindows/Mac/LinuxなどOSを問わず導入することができます。
JMeterでできること
無償で使える性能測定ツールとしてApache Benchというツールもありますが、JMeterはApache Benchより複雑なテストを行うことが可能です。そのほんの一例を挙げてみます。
・ Basic認証が必要なページにアクセスできる
・ スレッドごとに違うcookieを保持することができる。
・ リクエストのレスポンスを取り出して次のページのリクエストに使うことができる。
・ ヘッダーを変えることができる。(User Agentを変えて、モバイル用のページでテストを行う時などに便利)
・ 外部ファイルから値を読み込むことができる。
・ 複数台のマシーンでテストシナリオを共有することができる。
他にもたくさんできることがありますが、ここであげたのは自分が性能テストのシナリオを作成するときによく使う機能です。
これによって、複数のユーザが同時にアクセスする、書き込みなどでトークンが必要になる状況のテストを実行することができます。
JMeterのインストール
Java1.4以上実行環境があれば、インストールはとても簡単に行えます。
公式サイトのダウンロードページから、バイナリのtgzまたはzipファイルをダウンロードし、適当なディレクトリに展開すればインストール完了です。
JMeterの起動
JMeterをインストールしたディレクトリのbinに移動し、以下のコマンドを実行すればJMeterが起動します。
$ ./jmeter
Windowsの場合、jmeter.batをダブルクリックすれば起動します。
起動するとこんな感じにJMeterが立ち上がります。
シンプルなテストシナリオを作ってみる
JMeterがインストールできたら早速テストシナリオを作成しましょう!
JMeterのテストシナリオはテスト計画に要素を追加して作っていきます。
まずは、テスト計画を選択してそこで右クリックしてみましょう。
すると下の画面のように、追加でいろいろなものを追加できるようになります。
まずはテスト計画の下にスレッドグループを追加してください。
スレッドグループはいくつスレッドを立ち上げるか、何秒間ですべてのスレッドを立ち上げるか、何回繰り返すかなどテスト実行の基本部分となります。これによってどのくらいのアクセスをサーバに送るかの制御を行います。*1
スレッドグループを追加、設定したらスレッドグループで右クリックして追加->サンプラー->HTTPリクエストを選択し、追加してください。
このHTTPリクエストサンプラーでHTTPリクエストの送信を行います。これによってWebページのアクセスをモデリングします。
HTTPリクエストサンプラーでは主に以下の項目を設定します。
・ Webサーバ (ホスト名またはIPアドレスを設定)
・ ポート番号 (リクエストを送る先のポートを設定)
・ プロトコール (HTTP、HTTPSなどを記述)
・ メソッド (GET/POSTを選択)
・ パス (アクセスする先のパスを記述)
・ リクエストで送るパラメータ (リクエストするときに送信するパラメータ(フォームやログインID・パスワードなど)がある場合はここに記述)
・ リクエストと一緒に送信されるファイル (ファイルアップロードなどリクエスト送信時に送るファイルがあればここに記述)
今回は下の画面のように、単純に自宅のサーバにリクエストを送るようにしてみました。
(Apacheをインストールした直後のIt Worksが出てくるだけのページですがw)*2
これでもテストを実行することもができますが、レスポンスの状況がどうか確認するためにリスナーを追加します。
リスナーにはいくつか種類がありますが、ここでは「結果をツリーで表示」を追加しましょう。同じくスレッドグループで右クリックし、追加->リスナー->結果をツリーで表示で追加してください。
この結果をツリーで表示は、スレッドごとに送信リクエストの内容、レスポンスの結果、レスポンスの内容が詳細に表示されます。テスト作成段階でよく使用されます。
これでテストシナリオが完成したので、保存して実行しましょう。
実行->開始でテストが実行されます。
すべてのスレッドが、指定した繰り返し回数実行すると自動的に実行終了します。
スレッドの繰り返しを無限にした場合、または何らかの事情で停止したい場合は、実行->停止を押してください。
実行するとリスナーに随時実行結果が表示されます。
結果をツリーで表示の場合は、成功したリクエストには緑色のアイコンが表示されリクエストを選択すると、リクエストごとのレスポンス時間などの詳細なデータを見ることができます。
今回は単純なページアクセスでJMeterのシナリオ作成の基本を紹介しました。今回くらいのテストだとApache Benchのほうが楽に作れますが、次回以降より複雑なシナリオ作成に挑戦していきたいと思います。
*1: スレッド数はあまり多すぎると実行するマシーン、負荷をかけるサーバともに大きな負担となります。また正確な結果を得られない場合もあります。スレッド数を増やすときは最初は小さい数で初め、様子をみて増やすようにしてください。また多くのスレッド数を立てる必要がある場合は、複数のマシーンで行うことも検討してください。
*2: リクエストを送るwebサーバは自分が責任取れるサーバのみにしてください