目次
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
よしだです。
今回は JMeter を使った負荷テストの方法について、EC(通販)サイトを例に紹介していきたいと思います。
■ 概要
負荷テストとは何でしょうか?
単純にアクセス数を増やすだけではアタックにしかならないし、結果的にサーバの性能を計測しているに過ぎない結果となりかねません。ここでいう負荷テストは、実際の運用時のアクセス状況を想定し、これをシュミレートした適切な負荷をかけることをさします。
EC サイトの場合、ひとつの商品ページにアクセスが集中することはあまりありません。多くのユーザは、1. サイトのどこか(大半はトップページ)から入場し、2. 商品を検索し、3. 目的の商品ページにたどりつき、4. カートに入れて、5. 購入処理を行います(6. 必要であれば会員登録も行うでしょう)。それぞれのアクションの間隔は 3~10 秒くらいで、同じようなアクティブユーザが他に何人もいるのが一般的です。
正確な負荷テストを行いたいなら、このような状況を再現する必要があります。ここまで複雑な処理を手動テストするなんて考えたくありません。
そこで、これを自動化してくれるツール JMeter の登場というわけです。
■ 想定するシナリオ
アクセスされうるページ
先ほどあげた通り、EC サイトであればユーザは下記のページにそれぞれアクセスする可能性があります。
- トップページ
- 商品検索
- 商品詳細
- カート
- 購入ページ
- 新規会員登録
想定するデータ
負荷状況は、アクセス状況のほかに、サービスが持つ情報量にも左右することがあります。
ここでは下記のデータをサービスが所有するものとして話を進めていきます。
(この値は、およそ中規模程度の EC サイトが所有するデータ量になります)
- 商品数: 5,000
- 会員数: 5,000
- 受注数: 5,000
一般的に、
- 商品数が多ければ商品検索・商品ページの読み込みに
- 会員数が多ければログイン処理・会員登録処理に、
- 受注数が多ければカートに入れる処理、受注処理に
それぞれ時間がかかりがちになります。
EC サイトではアクティブユーザの大半が商品検索を行うことになるので、実際には商品まわりを重点的にテストすべきです。また、ここではわかりやすくするために数値を固定していますが、本来は商品数・会員数・受注数・アクティブユーザ数の値をそれぞれ変更した場合のテストも行い比較すべきです。
それではこのシナリオを JMeter に設定していきましょう!
■ JMeter 導入手順
改めて説明するものでもないので割愛します。
こちらでダオカさんが紹介しているので、ぜひ参考にしてみてください。
http://doruby.kbmj.com/daoka_tips/20090328/JMeter___
■ 用語解説
JMeter の用語を、今回のシナリオで必要になる要素に当てはめると下記のようになります。
- ○ スレッドグループ … 1ユーザの行動シナリオおよび設定
- ◇ スレッド数 … アクティブユーザ数
- ◇ Ramp-Up期間 … スレッドが開始する間隔(ユーザ数の立ち上がり緩急度)
- ◇ ループ回数 … シナリオを繰り返す回数
- ○ ガウス乱数タイマ … 1ユーザのアクセス間隔(平均 n 秒でページ遷移)
- ex.) 100アクティブユーザ * (1アクセス/5秒) = 20アクセス/秒
- ○ リクエスト … 各ページへのアクセス
- ○ コントローラ … 各ページへの遷移条件や順序を管理
■ シナリオ作成
スレッドグループ
今回の負荷テストでは用意したシナリオに、さらに次の条件をつけて設定しました。
- アクティブユーザ数: 会員数の 1%
- アクティブユーザのページ遷移間隔: 平均 5 秒
これに基づき下記のような設定を行って行きます
スレッド数: 50 (アクティブユーザ 50 人の想定) Ramp-up期間(秒): 10 (ページアクセスを開始をばらけさせるため) ループ回数: 5 (適度に繰り返して、より正確なデータを入手するため)
HTTP リクエスト初期値設定
「サーバ名または IP」にはテストしたいウェブページのアドレスを入力します。
これで以降登場する「HTTP リクエスト」のデフォルト値をいちいち変更する必要がなくなります。
HTTP クッキーマネージャ
クッキーを有効にするために、「HTTP クッキーマネージャ」をスレッドグループに追加します。
ガウス乱数タイマ
「アクティブユーザのページ遷移間隔: 平均 5 秒」を実現するためにタイマを設定します。
偏差: 2000 遅延時間オフセット定義: 5000
コントローラ&HTTP リクエスト
先に作成したシナリオに従って、下記のような構成・設定を行いました。
- ログインが必要でかつ未ログインである場合
- ログイン画面に遷移
- ログイン処理
- 次のうちどれかのページにランダムアクセス
- トップページ
- 商品検索
- 商品詳細
- 4/5の確立で商品詳細へのアクセスを続ける
- 直前に商品詳細にアクセスしていた場合
- カートに入れる
- 1/10の確立で注文処理
実際の画面では以下のような構成になっています。
■ シナリオを実行する
シナリオを設定し終えたら、あとは実行するだけです!
ここでスレッドグループに「結果を表で表示」をコントローラに加えておくと、アクセスログがばんばん表示されるようになります。この結果を Excel に貼り付けて保存するもよし、グラフとして保存するもよしで、割といろいろなことができます。
■ 終わりに
触り始めは覚えるのが大変な JMeter ですが、一度慣れてしまえばいろいろなことができるので楽しめると思います。ここではそのごく一部しか紹介できませんでしたが、ぜひ試してみていただければと思います。
■ 参考文献
解答例 - 実習課題1 - 8.負荷テスト計画の立て方 | TECHSCORE(テックスコア) http://www.techscore.com/tech/Java/ApacheJakarta/JMeter/answer/8-1/
JMeter の実践的な使用例として参考になります。
負荷テストあれこれ-JMeterの使い方-|A Day In The Boy's Life http://ameblo.jp/itboy/entry-10039380165.html
コントローラの説明がていねいでわかりやすいです。
コントローラ(IFコントローラ) - JMeterガイド - livedoor Wiki(ウィキ) http://wiki.livedoor.jp/susatadahiro/d/%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%E9%A1%CAIF%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%E9%A1%CB
わかりやすい IF コントローラの説明があります。
ガルーンの負荷テストをjmeterでやってみる|千代田区で働いていた元課長の退職日記 http://ameblo.jp/ys6872/entry-10355379947.html
よくわかるスレッドの解説が掲載されています。