normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

JMeter で ASP.NET アプリケーションの負荷テストを実施してみる 〜その 1 ASP.NET MVC の基礎編〜

さて、One ASP.NET Advent Calendar 2012 の 12日目、だれが何と言おうと12日目だ(白目。今回は皆さんがわくわくドキドキする JMeter を利用した ASP.NET の性能測定について紹介する。

JMeter って何?

色んな方がご存じだと思い、特に問題ないとは思うが一応紹介させて頂く。JMeter とは、Apache License で公開されているパフォーマンス測定用の Java アプリケーションだ。利用するためには当然のように Java のランタイムが必要になるため、Oracle さんのホームページ から JDK なり JRE をダウンロードする必要がある。
JMeter を利用するためには、Java のランタイム(JDK or JRE)をインストール後、JMeter - Downloads から Windows 向けのバイナリである zip 形式のファイルを取得し、任意のフォルダに展開すればOKだ*1

JMeter の動作概要

JMeter を利用して性能測定を行うためには、以下のステップをふむ必要がある。まずは、下準備として以下を実施する。

  • 1.性能測定対象のアプリをデプロイする
  • 2.JMeter を起動し、プロキシサーバとして起動する
  • 3.JMeter に性能測定用のシナリオを記録する

これらのイメージ図は以下となる。

次に、実際に JMeter を利用して以下の流れで負荷テストを実施する。

  • 4. JMeter プロキシサーバに記録されたシナリオを修正
  • 5. JMeter で負荷テスト実施
  • 6. レポーティングの分析

これらのイメージ図は以下となる。

また、今回は以下の構成で JMeter の負荷テストを実施した。理由としては、一つの端末で「IIS の動作&JMeter負荷テスト」を実施すると、負荷の原因がわかりにくくなるためだ。

次節からは実際に JMeter を利用した手順の概要を紹介する。

1.性能測定対象のアプリをデプロイする

まず、今回性能測定対象とするアプリの動作概要について説明する。ASP.NET MVC アプリと ASP.NET WebForm アプリを作成したが、特にASP.NET MVCおおよその流れは以下となる。

概要 画面
1.好みのキャラを選択
2.コメントを入力して投票
3.確認画面の表示

ASP.NET MVC アプリと ASP.NET WebForm アプリでほぼ同じ動作であり、ASP.NET MVC アプリと ASP.NET WebForm アプリは normalian github - JMeterSampleApps に配置したため、詳細については必要ならば参照してほしい。
次に、Visual Studio の[発行] 機能を利用して上記のアプリをローカル環境のIISに配置する。配置手順については MSDN - 方法: Visual Studio でワンクリック発行を使用して Web アプリケーション プロジェクトを配置する を参照してほしい。

2.JMeter を起動し、プロキシサーバとして起動する

まずは、JMeter を起動し、プロキシサーバとして設定する。JMeter を展開したディレクトリ(例では「C:\opt\apache-jmeter-2.8\bin」)に配置された jmeterw.cmd を実行することで、以下の画面が表示される。

こちらから、「テスト計画」を右クリックし、[追加]-[Threads(Users)]-[スレッドグループ]を選択して 新規のスレッドグループを作成する。

次に、「ワークベンチ」を右クリックし、[追加]-[Non-Test エレメント]-[HTTP プロキシサーバ]を選択して 新規の HTTP プロキシサーバを作成する。

作成した HTTP プロキシサーバに対して、以下を編集する。

  • ポート … デフォルトは 8080 だが、必要に応じて任意に変更
  • 対象となるコントローラ … 作成したスレッドグループを割り当てる
  • 除外するパターン … JavaScript, CSS, 画像ファイル等を正規表現でマッチングして除外する

全ての設定が完了した後、[開始]ボタンを押下して JMeter をプロキシサーバを起動する。

3.JMeter に性能測定用のシナリオを記録する

起動した JMeter のプロキシに対して、以下の画像を参考に IE の設定を変更する。ポート番号は先ほど JMeter で設定したポート番号と一致する必要があることに注意してほしい。ブラウザの設定変更後、JMeter が HTTP プロキシとして起動していることを確認した後、JMeter のシナリオに記録したい操作を実施する。

ブラウザ操作によるシナリオ作成後、JMeter の HTTP プロキシの画面から「停止」ボタンを押下してシナリオの記録を停止する。以下のようになっていればシナリオの取得は成功だ。

また、JMeterのシナリオ取得時に、ローカルホストに対してシナリオを作成する場合は C:\Windows\System32\Drivers\etc\hosts に対して以下の様に設定しないと IE がプロキシを通過しないことが有るのでご注意願いたい。ローカルアドレスの場合は、ブラウザがプロキシを経由しない処理になっている場合があるためだ。

# Copyright (c) 1993-2006 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

127.0.0.1       localhost
::1             localhost

# ★★★★★この 記載を編集すれば、後で Web Site 側への移行も容易
127.0.0.1       normaliansite.azurewebsites.net

4. JMeter プロキシサーバに記録されたシナリオを修正

JMeter に記録されたシナリオを修正する。まず、今回作成したシナリオには gif の取得用リクエストが残っているため、当該項目を右クリックし、メニューから[削除]を選択して削除する。
次に、[テスト計画]-[スレッドグループ]を選択し、[スレッド数]を 120、[ループ回数]を 無限ループと設定する。同項目を設定することで、JMeter ラッシュの多重性とシナリオのループ回数が設定可能だが、今回は仮決めで設定する。
更に、「スレッドグループ」を右クリックし、[追加]-[リスナ]から以下のリスナを追加する。

  • 結果を表で表示
  • 統計レポート

設定が完了した場合、以下のようになるため参考にしてほしい。

以上で JMeter シナリオの作成は完了だ。

5. JMeter で負荷テスト実施

準備が長いだけに、JMeter を利用した負荷テスト実施はもう目の前だ。2台の端末に対して以下を実施して欲しい。

上記を実施した後、JMeter のシナリオを実施する。JMeter にて[統計レポート]の画面を選択している場合、リアルタイムにスループットが表示される(以下参照)。

また、「リソースモニタ」側ではメモリの利用状況が表示されていることが確認できる。

6. 負荷テストのレポーティングを分析

ここまで来て力尽きたので、レポーティングについては章を区切って紹介させて頂ければ幸いだ(汗。

参考URL

*1:Java ランタイムへの PATH 設定も忘れないこと