負荷テストを実施する際に Apache License で公開されている JMeter を使うことがあるかと思います。
Web アプリケーションの負荷テストについては
JMeterでWebアプリケーションのパフォーマンス測定を行う
JMeter で ASP.NET アプリケーションの負荷テストを実施してみる ~その 1 ASP.NET MVC の基礎編~
で紹介されていますが SQL Server 単体に対して、JMeter で負荷テストをするための方法は日本語ではあまり見かけなかったので少しまとめてみたいと思います。
なお、本投稿は、
SQL query performance test with JMeter
Load Testing Relational Databases With JMeter
を参考にさせていただいています。
■JMeter のインストール
JMeter は Java のアプリケーションですので、負荷をかけるクライアントとなる端末には Java のランタイム (JRE) をインストールする必要があります。
私は Java Standard Edition 7 の JRE をインストールし JMeter を実行しました。
Java のランタイムは こちら から入手することが可能です。
# 今回は、JRE 7 u13 の x64 をインストールしています。
今まで気づかなかったのですが、今の JRE のインストーラーは C:windowssystem32 配下に java.exe / javaw.exe / javaws.exe をコピーしているようで環境変数の PATH に java.exe までのパスを通さなくても実行できるようなのですが、必要に応じて java.exe までのパス (デフォルトでは C:Program FilesJavajre7bin) を設定します。
# JAVA_HOME に関しては使っていないようですので設定しなくても大丈夫でした。
環境変数周りに関しては PATHの設定及び環境変数JAVA_HOMEの設定 が参考になります。
JRE のインストールが終わったら JMeter をダウロードします。
[Download Release] をクリックすると JMeter のダウンロード先のリンクが表示されます。
JMeter はバイナリ版が提供されていますので、今回はこちらの ZIP をダウンロードしています。
ダウロードしたファイルはプロパティを開いて [ブロックの解除] をしておくとよいかと。
JMeter はインストーラーはなく展開したファイルをそのまま利用することになりますので、適当なディレクトリに展開し、[bin] の下の [jmeter.bat] をクリックして起動します。
下のような画面が起動すれば、JRE のインストールも含め JMeter の導入は完了です。
■JDBC Driver のインストール
JMeter から任意の RDBMS に接続することができるのですが、Java のアプリケーションですので接続は JDBC 経由で行います。
SQL Server の JDBC は以下からダウンロードすることができます。
Microsoft JDBC Driver 4.0 for SQL Server
ダウロードしたファイルを展開すると以下のファイルがあります。
今回は sqljdbc4.jar が必要になりますので、このファイルを JMeter の lib に配置します。
これで JDBC 経由で SQL Server に接続することが可能になります。
SQL Server の JDBC を使用する際の注意点として、統合セキュリティ (integratedSecurity) を使用して SQL Server に接続をする場合は、もう一つ作業をする必要があります。
接続 URL の構築 に書かれているのですが、統合セキュリティを使用して Windows 認証をする場合には、[sqljdbc_auth.dll] を適切なフォルダに格納する必要があります。
今回はこのファイルを [C:WindowsSystem32] に格納しています。
この設定をしておかないと、
com.microsoft.sqlserver.jdbc.SQLServerException: このドライバーは、統合認証を行えるようには構成されていません。
というエラーとなり、Windows 認証を使用して SQL Server に接続することができません。
# SQL Server 認証に関しては sqljdbc_auth を使わなくてもできるようですが。
■JMeter で SQL Server にクエリを実行
ここまでの作業が完了したら JMeter で SQL Server にクエリを実行できるように設定をします。
jmete
r.bat を実行して JMeter を起動します。
最初に JDBC の設定をします。
テスト計画を右クリックして [追加] → [設定エレメント] → [JDBC Connection Configuration] をクリックします。
今回は Windows 認証を使用して SQL Server に接続をしますので以下の項目を入力します。
Variable Name | 設定の名称。テストをする際にどの接続を使用するかを識別するための名称 |
Database URL | JDBC の接続文字
jdbc:sqlserver://localhostSQL2012;databaseName=master;integratedSecurity=true; |
JDBC Driver class | JDBC のクラス
com.microsoft.sqlserver.jdbc.SQLServerDriver |
次のこの接続を使用してストレステストを実行できるようにクエリを作成します。
[追加] → [Threads (Users)] → [setUpThread Group] をクリックします。
スレッド数を設定したら、実行するクエリを指定します。
スレッドに対して実行するクエリを指定しますので、作成した setUp Thread Group を右クリックして、[追加] → [サンプラー] → [JDBC Request] をクリックします。
今回は単純なクエリを実行しますので以下のような設定をします。
今回はパラメーターは使用していないため、接続に使用する情報と実行したいクエリを指定しています。
Variable Name | 使用したい JDBC Connection Configuration の Variable Name |
SQL Query | 実行したいクエリ |
設定に関しては以上で完了ですが、このままでは実行状態やエラーの情報がわかりませんので、テスト計画を右クリックして [追加] → [リスナー] → [統計レポート] をクリックします。
# 他のリスナーでもよいかもしれませんが。
統計レポートは以下のような設定になります。
[ファイル名] でログファイルを出力するようにしておくと、エラーの発生時にエラー内容をつかみやすい、後で結果を再確認することができますのでログを出力するようにしておくとよいかと思います。
設定が一通り終わったらテスト計画を保存して [実行] → [開始] をクリックします。
実行後に統計レポートの Error がカウントされていなければ正常に実行されています。
最初のうちは、SQL Server Profiler を設定して実行されているかを確認しておくとよいかもしれないですね。
[SQL:BatchCompleted] 等をキャプチャすれば稼働状況が確認できます。
デフォルトですと ApplicationName が [Microsoft JDBC Driver for SQL Server] となっているのでここで判断できると思います。
Applicati
onName はリソースガバナーの制御としても使えますので、クエリ単位で制御をしたい場合には、JDBC の接続文字列を [jdbc:sqlserver://localhostSQL2012;databaseName=master;integratedSecurity=true;ApplicationName=JMeter Request #1;] というように設定すると、アプリケーション名が設定できますのでこの辺りを使用するとよいかと。
複数のクエリを実行したい場合には、JDBC Request を以下のようにせってすると順番にクエリを実行することができます。
こちらが複数のスレッド (2 スレッド) で実行した際の実行結果となります。
複数のスレッドで実行しても厳密に同時に実行されるということではないようですね。
同時に複数の種類のクエリを実行したい場合などは、以下のように設定するとよさそうですね。
グラフ表示などをすることもできますのでこの辺も有効に使うとよさそうです。
パラメーターを使用したクエリの実行については Load Testing Relational Databases With JMeter で紹介されていますのでこちらを参考にするとできそうです。
単一クエリの負荷ツールはいくつか使っていたのですが、JMeter で実行するとテストの幅が広くなりそうですね。