Apache JMeter - Apache JMeter™
Apache JMeter はパフォーマンス計測用のツールです。
Webアプリケーションのテストをするための様々な機能が用意されているので、複雑なテストを行うことができます。
今回はRailsアプリケーションのパフォーマンス計測をしてみたいと思います。
Railsプロジェクトを作成する
$ mkdir demo;cd demo $ echo demo > .rbenv-gemsets $ gem install bundler $ gem install rails $ rails new . $ rake db:create
# Gemfile gem 'devise'
$ bundle install $ rails generate devise:install $ rails generate devise User $ rails g scaffold Message title:string body:text $ rake db:migrate
$ rails c > 1.upto(10) { |i| User.create(email: "user#{i}@example.com", password: 'password') } $ rails s
Apache JMeter をインストールする
$ wget http://ftp.kddilabs.jp/infosystems/apache//jmeter/binaries/apache-jmeter-2.11.tgz $ tar zxfv apache-jmeter-2.11.tgz $ cd apache-jmeter-2.11/bin/
Apache JMeter を起動する
$ java -jar ApacheJMeter.jar
日本語にする
[Options] > [Choose Language] > [Japanese]を選択する。
スレッドグループを作成する
[Test Plan]を右クリック > [追加] > [Threads(Users)] > [スレッドグループ]を選択する。
スレッド数: 一度のテストで生成するスレッド(クライアント)数。 Ramp-Up 期間(秒): 全スレッド数を生成する時間。 ループ回数: スレッドを繰り返す回数。
各設定項目は上記のような内容になっています。では設定してみましょう。
名前: メッセージ機能 スレッド数: 10 Ramp-Up 期間(秒): 10 ループ回数: 3
30スレッドを10秒で負荷テストするということになります。
ログイン用のシナリオを作成する
「一度だけ実行されるコントローラ」を作成する
[メッセージ機能]を右クリック > [追加] > [ロジックコントローラ] > [一度だけ実行されるコントローラ]を選択する。
名前: ログイン
ログイン画面のサンプラーを作成する
サンプラーはテスト対象のサーバへ送るリクエスト情報です。
[ログイン]を右クリック > [追加] > [サンプラー] > [HTTPリクエスト]を選択する。
名前:GET new_user_session Webサーバー: サーバ名またはIP: localhost ポート番号: 3000 HTTPリクエスト: プロトコル: HTTP メソッド:GET パス: /users/sign_in
ログイン処理のサンプラーを作成する
[ログイン]を右クリック > [追加] > [サンプラー] > [HTTPリクエスト]を選択する。
名前:POST user_session Webサーバー: サーバ名またはIP: localhost ポート番号: 3000 HTTPリクエスト: プロトコル: HTTP メソッド:POST パス: /users/sign_in リクエストで送るパラメータ: 1: 名前: user[email] 値: ${email} 2: 名前: user[password] 値: 'password'
※ 「${email}」は後でユーザーパラメータで設定します。
メッセージ登録用のシナリオを作成する
「ループコントローラ」を作成する
[メッセージ機能]を右クリック > [追加] > [ロジックコントローラ] > [ループコントローラ]を選択する。
名前: メッセージ登録 ループ回数: 5
メッセージ登録画面のサンプラーを作成する
[メッセージ登録]を右クリック > [追加] > [サンプラー] > [HTTPリクエスト]を選択する。
名前: GET new_message Webサーバー: サーバ名またはIP: localhost ポート番号: 3000 HTTPリクエスト: プロトコル: HTTP メソッド:GET パス: /messages/new
メッセージ登録処理のサンプラーを作成する
[メッセージ登録]を右クリック > [追加] > [サンプラー] > [HTTPリクエスト]を選択する。
名前:POST messages Webサーバー: サーバ名またはIP: localhost ポート番号: 3000 HTTPリクエスト: プロトコル: HTTP メソッド:POST パス: /messages リクエストで送るパラメータ: 1: 名前: message[title] 値: 'message title' 2: 名前: message[body] 値: 'message body'
ユーザーパラメータを作成する
パラメータを動的に設定したい場合に使用します。
今回はログインユーザをスレッド単位で切り替えるために使用します。
[メッセージ機能]を右クリック > [追加] > [前処理] > [ユーザーパラメータ]を選択する。
名前: ログイン情報 パラメータ: 名前: email ユーザー1:'user1@example.com' ユーザー2:'user2@example.com' ユーザー3:'user3@example.com' ユーザー4:'user4@example.com' ユーザー5:'user5@example.com' ユーザー6:'user6@example.com' ユーザー7:'user7@example.com' ユーザー8:'user8@example.com' ユーザー9:'user9@example.com' ユーザー10:'user10@example.com'
これでサンプラーから${email}で指定することが可能になります。
RailsのCSRF設定をする
「GET new_user_session」で右クリック > [追加] > [後処理] > [正規表現抽出]を選択する。
名前: fetch authenticity_token 参照名: authenticity_token 正規表現: <input name="authenticity_token" type="hidden" value="(.*?)" /> テンプレート: $1$
「POST user_session」、「GET new_message」も同様。
次に「POST user_session」、「GET new_message」、「POST messages」の [HTTPリクエスト][リクエストで送るパラメータ] に以下を追加
名前: authenticity_token 値: ${authenticity_token} Encode?:チェックする
「GET new_message」、「POST messages」も同様。
クッキーに対応させる
[メッセージ機能]を右クリック > [追加] > [設定エレメント] > [HTTP クッキーマネージャ]を選択する。
名前: ログイン認証
リスナーを作成する
テスト情報の収集、結果の表示方法を設定します。
[メッセージ機能]を右クリック > [追加] > [リスナー] > [結果を表で表示]
[メッセージ機能]を右クリック > [追加] > [リスナー] > [グラフ表示]
テストを実行する
メニュー > [実行] > [開始]
結果を確認する
総リクエスト数 = スレッド数 × ループ回数 × スレッドグループ内のリクエスト数 1秒あたりのリクエスト数 = 総リクエスト数 ÷ Ramp-Up 期間(秒)
これに当てはめると以下のようになります。
ログイン処理:20(10 × 1 × 2)リクエスト メッセージ登録:300(10 × 3 × 10)リクエスト 総リクエスト数:20 + 300 = 320 1秒あたりのリクエスト数:320 ÷ 10 = 32
結果を表で表示
グラフ表示
このように Apache JMeter を使えば簡単にパフォーマンス計測をすることができます。
次回はもう少し複雑なテストや結果の見方について書いていきたいと思います。
今回作ったものは以下にアップしています。
rails-jmeter-sample.jmxを Apache JMeter で開いて使ってください。