システム開発のリスクヘッジを考える 
第3回 簡単にできるデータベースの負荷テスト

負荷テストを人手だけで行うには限界があり、テストツールの利用が欠かせません。Oracle Application Testing Suiteは「簡単に使える」「正確なテストが行える」「機能が充実している」など、限られた時間やリソース制約のなかで容易かつ迅速なテストを実現できます。 今回は昨年末にリリースされた「Oracle Application Testing Suite 9.2」について、待望のデータベース負荷テストの新機能を解説していきます。(編集部)
 
■ ユーザー視点とシステム視点での負荷テスト
負荷テストは最終的にはユーザー視点で行います。Webシステムの場合は、多数のユーザーがブラウザ操作を行っている際の応答時間やエラーの発生状況などを負荷テストで確認します。
しかし、Webシステムを構成するソフトウェアやハードウェアなどの各システムそれぞれで性能を満たさなければ、ユーザー視点での性能は達成できません。例えば、ブラウザ操作を行った際の応答時間の目標が3秒なのにデータベースのSQLクエリに10秒も要していた場合は、そもそも負荷テストは無意味となってしまいます。
このため、Webサーバーであれば単位時間あたりのスループット(ページビューやヒット数など)、データベースサーバーであればSQLクエリの応答時間など、各システムが性能を達成していることを事前に確認することも重要です。

■Oracle Load Testingによる負荷テスト
Oracle Application Testing SuiteはOracle Functional Testing、Oracle Load Testing、Oracle Test Managerの3つの製品で構成されており、負荷テストはOracle Load Testingを利用します。

Oracle Load Testingは簡単な操作でWebシステムやOracle Databaseの負荷テストを行うことができます。データベースの負荷テストを行う事により、データベース単独での性能を検証したり、サイジングなどの基礎情報を取得したりする事ができます。またWebシステムとデータベースの負荷テストを同時に行うことにより、より運用に近い負荷テストを容易に行う事もできます。Oracle Load Testingは単に負荷を与えるだけでなく、WebシステムのOSやアプリケーションサーバー、データベースサーバーなどの性能情報をエージェントレスでリアルタイムに監視する「ServerStats」もあります。

負荷テストはあらかじめ作成したテストスクリプトを使用して複数のセッション(仮想ユーザー)のアクセスを行います。テストスクリプトはWebシステムであればアクセスする画面遷移、データベースであればSQLなど、負荷テストの目的に応じて必要な情報を記録します。
Oracle Load TestingではOracle Application Testing Suiteのコンポーネントの1つであるOpenScriptを使用してGUIで簡単にテストスクリプトを作成できます。また、負荷テスト以外に機能テストのテストスクリプトを作成することもできますので、テストの目的ごとに別々のツールを覚えなくてはならないというような負担を軽減できます。

負荷テストを行う際に注意しなくてはならないことの一つに、より運用に近い正確な負荷をかけられているかと言う点があります。例えばショッピングサイトにおける商品検索の画面を考えてみます。この画面では商品のキーワードを入力し、検索結果の一覧から欲しい商品を探しクリックします。この際、すべてのユーザーが同じキーワードを入力するとデータベースやアプリケーションで想定していないキャッシュが効いてしまいます。また人が手動で操作する際は検索結果の一覧から目的の商品を探して選択するまでにコンテンツを閲覧したりマウスを操作したりする時間(思考遅延時間)が発生しています。負荷テストを行う際も思考遅延時間を含めるべきです。負荷テストの際にこれらを正確に再現しないと、応答時間もシステム負荷も運用時とは違う結果になってしまうかもしれません。
Oracle Load TestingおよびOpenScriptでは、CSVファイルやデータベースのデータを元に入力値などのパラメータを変更する「データバンク」、人の操作と同等の待ち時間を挿入乳する「思考遅延時間(VUペーシング)」などの機能により、正確な負荷テストを実現できます。

■ 負荷テストの実施
それではデータベースの負荷テストを行いながら、Oracle Load Testingの操作手順や機能を見ていきます。

Oracle Load Testingによる負荷テストは次の2つのステップで実施します。

Step1 テストスクリプトの作成
OpenScriptを使用して接続先データベースの定義や実行するSQLなどをテストスクリプトに記録します。

Step2 負荷テストの実施
使用するテストスクリプトや負荷のかけ方、ServerStatsによるサーバー監視を指定し負荷テストを実行します。負荷テストの状況はリアルタイムにレポート表示されます。

Step1 テストスクリプトの作成
1. スクリプトの作成
OpenScriptの[新規]ボタンをクリックして<一般>-<データベース>を指定し、新規スクリプトを作成します。
img_pickup_110310_01.gif
 テストスクリプトに負荷テストを行うデータベースサーバーやSQLを登録します。OpenScriptでは次のいずれかによりSQL簡単に登録することができます。
  • Oracle Real Application Testing でキャプチャしたファイルのインポート
  • SQLやPL/SQLスクリプトのインポート
  • 手動入力
 本ステップではSQLファイルをインポートします。メニューから[ツール]-[データベースファイルのインポート]を選択し、「データベース ファイル フォーマット」として"SQL および PL/SQL 構文スクリプト"を選択します。
img_pickup_110310_02.gif
 「ソースファイル」にSQLファイルを指定し、[次へ]ボタンをクリックします。
テストスクリプトに含めるSQLをチェックして「対象データベース」に接続先のデータベースを指定し、[終了]ボタンをクリックします。
img_pickup_110310_03.gif
 以上の操作により、テストスクリプトのベースラインが作成されます。
img_pickup_110310_04.gif
 テストスクリプトはInitialize,Run,Finihshの3つのセクションから構成されます。
負荷テストを開始すると定義されたデータベースに接続を行い(Initialize)、SQLを繰り返し実行します(Run)。負荷テスト終了時にはデータベースからの切断を行います(Finish)。

2. データバンクの設定
作成したテストスクリプトのベースラインのままでも負荷テストを実行できます。ただし、すべてのセッション(仮想ユーザー)がまったく同じSQLを実行しますので、正しいテスト結果が得られない可能性があります。このため、データバンク機能により様々なデータパターンでSQLを実行できるように設定します。

テストスクリプトからパラメータのデータバンク化を行いたいSQLノードを右クリックしプロパティを表示後、[パラメータ化]ボタンをクリックするとINSERT文やWHERE句のVALUEがパラメータ化されます。
img_pickup_110310_05.gif
 パラメータ化された値を選択し[編集]ボタンをクリックして表示されるダイアログの[変数の置換]ボタンにより変数の置換ウィザードが表示されます。
img_pickup_110310_06.gif
 <データバンク>-<新規データバンクの追加>を選択して[次へ]ボタンをクリックし、「データベースタイプ」に"CSVファイル"を選択します。データバンクとして使用するCSVファイルを選択して[次へ]ボタンをクリックします。パラメータに使用するCSVファイルのカラムを選択して[終了]ボタンをクリックすると、設定が完了します。他にもパラメータ化する値があれば同様の手順を繰り返します。
img_pickup_110310_07.gif
3. ステップグループの設定
次にSQLの応答時間をレポートに出力できるよう、ステップグループを作成します。
Runノードを右クリックして[追加]-[その他]で表示される追加ダイアログから<一般>-<ステップグループ>を選択します。タイトルに "[n] ステップ名" を入力します。このステップグループ内のSQLが実行される前に思考遅延時間(シンクタイム)を付加する場合は、その時間を入力します。

Runノードに追加されたステップグループにSQLをドラッグ&ドロップします。同様に必要なステップグループを作成します。
img_pickup_110310_09.gif
 以上でテストスクリプトの作成は終了です。
他にもSQL間に思考遅延時間を設定したり、SELECTの行数テストなどを追加したりする機能もあります。

Step2 負荷テストの実施
Step1で作成したテストスクリプトを元にOracle Load Testingを使用して負荷テストを実施します。Oracle Load Testingはブラウザベースで操作できますので、遠隔地からのテストも容易に行えます。

Oracle Load Testingにログインすると5つのタブから構成された画面が表示されます。それぞれのタブを操作手順に従って説明します。

1. シナリオの設定
[シナリオの設定]タブではOpenScriptで作成したテストスクリプトを元に、どのような負荷をかけるか設定します。
img_pickup_110310_11.gif
 「スクリプトの選択」から負荷テストで使用するテストスクリプトを選択して[シナリオに追加]ボタンをクリックします。
「シナリオのパラメータを設定」に追加されたテストスクリプトの「VU数」(同時セッション数)や「VUペーシング」(思考遅延時間)などの指定を行います。テストスクリプトの設定が終わったら[オートパイロットへ追加]ボタンをクリックします。

2. オートパイロットの設定
[オートパイロットの設定]タブではテストの開始・停止の条件やサーバーの性能監視(ServerStats)を設定します。
img_pickup_110310_12.gif
 「タイミングとイベントコントロール」で負荷テストの開始および停止の条件や仮想ユーザーのランプアップのタイミングを指定します。すべての仮想ユーザーを最初から実行することもできますし、少しずつ増加させて性能がどのように変化するかを確認することもできます。
「ServerStats設定」では負荷テストを実行しながら各サーバーやネットワーク機器の性能を監視するServerStatsの定義情報を指定します。監視するサーバーやメトリックは[ServerStats]メニューから設定できます。
すべての設定が終了したら、右上にある緑色の[負荷テストの開始]ボタンをクリックします。テスト中のセッションを保存するダイアログが表示されるので任意のセッション名およびAWRベースラインを作成有無(ServerStatsでデータベースの監視を定義した場合のみ)を指定し、[OK]ボタンをクリックすると負荷テストが開始されます。
img_pickup_110310_13.gif
 負荷テストを開始すると、[負荷テストの開始]ボタンが[すべての仮想ユーザーの停止]ボタンに切り替わります。負荷テストを終了する際はこのボタンをクリックします。

3. VUグリッドの参照
[VUグリッドの参照]タブでは負荷テスト中の仮想ユーザーの状態を参照できます。
それぞれの仮想ユーザーが実行しているステップグループや使用しているデータバンク、1つのトランザクションに要した応答時間などがリアルタイムで更新されます。

4. グラフ実行の参照
[グラフ実行の参照]タブでは応答時間やサーバーの性能を簡単にグラフで表示できます。
img_pickup_110310_16.gif
 「概要」タブでは時間の経過とともに応答時間やエラーの発生状況などがリアルタイムにグラフ表示されます。
「レポート」タブでは完了したトランザクション数やステップグループ毎の応答時間などの統計情報が表示されます。
[新規ビュー]ボタンをクリックすることにより、テスト中の様々な性能情報を自由に確認できるグラフタブが表示されます。「使用可能なデータシリーズ」からグラフに追加したいメトリックを選択し[>]ボタンをクリックすると、その値がグラフに表示されます。グラフには複数のメトリックを表示できます。

またグラフ右側のボタン群によりグラフの表示方法や表示範囲の指定や、グラフのエクスポート(JPG/PNG/CSV/XLS)などを行う事ができます。
img_pickup_110310_18.gif
5. レポートの作成
[レポートの作成]タブでは過去のテスト結果のグラフを作成できます。複数のテスト結果を同時に表示できますので、チューニング前後の比較なども簡単に確認できます。

グラフに追加したいテスト結果を「セッション」から選択し、メトリックをグラフに追加します。別のテスト結果をグラフに追加するには「セッション」を選択して同様に操作します。右側の[グラフオプションの表示]ボタンをクリックして、X-軸の「スケール」に"相対時間"を指定すると同じ時間軸でグラフ表示されます。
img_pickup_110310_20.gif
■最後に
非常に簡単な操作でデータベースの負荷テストが実施できることをご理解いただけたかと思います。負荷テストを行う際に比較的時間のかかる「テストスクリプトの準備」と「テスト後のレポート作成」をOracle Load TestingおよびOpenScriptはGUIを中心とした簡単な操作で効率よく行う事ができます。またデータバンクや思考遅延時間などの機能を用いて、より運用環境に近い正確な負荷テストを実施できます。

今回はデータベースを対象としましたが、Webシステムでも同じようなステップにより負荷テストが行えます。テストスクリプトもInternet ExplorerやFirefoxなどのブラウザでWebシステムの画面遷移を操作するだけで簡単に作成できます。

Oracle Wikiにおいてインストール方法など製品の情報を提供していますので、ぜひ一度試してみてください。
■コラム
OpenScriptのGUIでテストスクリプトを作成すると、自動的にJavaコードが生成されます。Javaコードを直接編集してテストスクリプトを拡張することができます。
img_pickup_110310_10.gif