アプリケーションのギアを上げよう ― Visual Studio 2010でアプリケーションのパフォーマンス・チューニング ― 第5回 Webサービスのパフォーマンス・チューニング 亀川 和史2011/12/09 |
Page1
Page2
|
最近の業務用アプリケーションでは、Webサービスを提供することも多い。そこで今回は、Webサービスにおけるパフォーマンスの調査・チューニング方法に関して解説する。
なお、本稿のコードは、C#を用いて記述する。
■Webサービスの負荷テスト
●Webサービスのテスト・シナリオの手助けになるWCF Load Test
Visual Studio 2010 UltimateにはWebサービス用の負荷テスト機能が搭載されている(参考:「MSDN:ロード テストのためのテスト コントローラーおよびテスト エージェントの構成」)。テスト・プロジェクトを作成して負荷テストを作るのもよいが、WCFのトレース情報を基にテスト・コードを作成してくれる「WCF Load Test」というツールがCodePlexで公開されているので、本稿ではこれを利用する。WCF Load Testは、2010年以降更新されていないようだが、Visual Studio 2008および、Visual Studio 2010に対応している。
テスト・コードの作成方法としては、「C:\Program Files\WcfUnit」(32bit OSの場合。64bit版の場合「C:\Program Files(x86)\WcfUnit」)にインストールされるコンソール・プログラム(=WcfUnit.exeファイル)を使う方法と、Visual Studioの単体テスト・プロジェクトと連携して使用する方法の2つがある。ここではVisual Studioの単体テスト・プロジェクトから呼び出す方法を紹介する。
CodePlexから最新版(.zipファイル)をダウンロードして展開する。展開されたフォルダ内に「WcfUnitEn.msi」という.msiファイルがあるので、これをダブルクリックして実行すると、WCF Load Testのインストールが行われる。WCF Load Testは、英語版のVisual Studioにしか対応していないので、日本語版Visual Studioではインストール後、以下の作業を行う必要がある。
- 「C:\Program Files」の直下(32bit OSの場合。64bit版の場合、「C:\Program Files(x86)」)に「WcfUnit10.zip」という.zipファイルがあるので、「C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\1041」に移動する
- [管理者として起動]したVisual Studio 2010コマンド・プロンプトから「devenv /setup」というコマンドを実行する(次の画面を参照)
WCF Load Testを日本語Visual Studioで有効にするために必要なコマンドの実行例 |
これでWCF単体テストのプロジェクト・テンプレートがVisual Studioに読み込まれる。この処理にはかなり時間がかかるので、しばらく待ってほしい。終了後、テスト・プロジェクトを作って、[新しいテスト]を追加するときにWCF Testが選択肢として現れるが、手順の都合上、後で解説する。
テスト対象として、テスト・プロジェクトを作る前に1つ簡単なWCFサービスを作っておこう。「WCF サービス アプリケーション」のプロジェクト・テンプレートから、以下のようなサービス(本稿では「WcfService1」という名前のプロジェクト)を作る。サービス側で指定した行数だけ文字列を詰めて、2秒待ってから返却するという極めて単純なものだ。
|
|
WCFサービスの定義(IService1.cs) |
|
|
WCFサービスの実装(Service1.svc.cs) |
次に、同じソリューション内にこのWCFサービスを利用する「コンソール アプリケーション」のクライアント(本稿では「WcfClient」という名前のプロジェクト)を作成しよう。[ソリューション エクスプローラー]のプロジェクト項目の右クリック・メニューから[サービス参照の追加]を実行して、そこで表示されるダイアログで[探索]ボタンをクリックして[アドレス]欄にソリューション内のWCFサービスを指定し、[名前空間]欄に「WcfSampleService」を入力して[OK]ボタンをクリックする。その後、下記のコードを記述する。
|
|
WCFサービスを利用するクライアント用コンソール・アプリケーション(Program.cs) |
プログラム起動時の引数に正数を指定すれば「WCF Service Test」という文字列が2秒のスリープの後、返却される。このサービスをWCF Load Testで試してみよう。メニューバーの[ツール]メニューにある、[WCF サービス構成エディター]を起動する。
[WCF サービス構成エディター]を起動するためのメニュー項目 |
[WCF 構成エディター]を起動したら、(メニューバーの[ファイル]メニューから[開く]−[構成ファイル]を実行して)WCFサービスを呼び出すクライアント・プロジェクト(WcfClient)内にあるapp.configファイルを読み込み、WCFの構成ファイルを以下のように修正する。
[WCF 構成エディター]における[メッセージ ログ]の設定 | |||
左側の[構成]ツリーの[診断]−[メッセージ ログ]を選択した状態で、下記項目の設定を行う。 | |||
|
これだけ変更すればよい。メニューバーの[ファイル]メニューから[保存]すればapp.configファイルが変更され、次の通信からメッセージ・ログが採取される。
そのログはWCF Load Testが使用する。(WCFサービスを実行した状態で)コマンドラインから先ほど作成したクライアントを実行すると、そのクライアントのプロジェクト・フォルダの中にログ・ファイルが生成される。そのログ・ファイル名は、[WCF 構成エディター]の[診断]の[メッセージ ログ]の[ログ ファイル]ところに記載されている名前(=今回の場合は「app_messages.svclog」というファイル名)となる(そのファイル名のフル・パスは、app.configファイルでは<sharedListeners>要素のinitializeData属性に書かれている)。
それでは、WCFサービス側の準備は終わったので、同じソリューション内に単体テスト・プロジェクトを追加しよう。
メニューバーの[テスト]メニューから[新しいテスト]を選択すると、そこで表示される[新しいテストの追加]ダイアログでは、以下のように「WCF Test」テンプレートが選択できるはずだ。
新しいテストの追加]ダイアログで選択できる「WCF Test」テンプレート |
「WCF Test」テンプレートを選択して、[テスト名]欄は「WCFTest1.cs」のまま、[テスト プロジェクトの追加]欄は「Visual C# テスト プロジェクトの新規作成」のまま、[OK]ボタンを押す。[新しいテスト プロジェクト]ダイアログが表示されるので、プロジェクト名(ここでは「TestProject1」)を入力して[作成]ボタンを押すと、テスト・プロジェクトが作成される(もちろん事前にテスト・プロジェクトを作成しておいてもよい。なお、テスト・プロジェクトはWCFのクライアント・プロジェクトと同じソリューションに追加しておけば参照が簡単になるので、可能な限りクライアントと同じソリューションに追加しておくことをお勧めする)。
次に[New WCF Scenario Test Generation Wizard](以下、「ウィザード」と表記)が表示される。WCF Load Testでは、シナリオに沿って自動的にWCF Load Testが実行するが、このウィザードでシナリオを作成する。
[Next]ボタンを押す |
||||||||||||||||||||||||
この画面ではメッセージ・ログをどのように採取して使用するかという方法を選択する。必要に応じて使用すればよい | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
今回はキャプチャ済みのログを使用するので、[Use a pre-captured message log file]ラジオボタンを選択して、採取済みのメッセージ・ログ・ファイルのフル・パスを指定する |
||||||||||||||||||||||||
クライアント側でメッセージ・ログを採取したので、[Message log file type]欄で[Client-side]ラジオボタンを選択して[Parse]ボタンを押せば[Next]ボタンが有効になるのでそれを押す。 |
||||||||||||||||||||||||
WCFサービス・クライアントが発行したSOAP呼び出しが表示される。例えば複雑な操作の中で一部の呼び出しのみをテスト・シナリオとしたい場合、不要な呼び出しの行にある[Select]列のチェックボックスからチェックを外せばよい。チェックされた呼び出しのみがテストとして構成される。 | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
[Next]ボタンを押す |
||||||||||||||||||||||||
WCFのコントラクトのプロキシを使う場合、ここでプロキシ・クラスを含むアセンブリを追加する。 | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
[Add]ボタンを押して、WCFのコントラクトのプロキシを含むアセンブリ(ここでは「WcfClient.exe」ファイル)の参照設定を行う 最後に[Finish]ボタンを押す |
||||||||||||||||||||||||
[New WCF Scenario Test Generation Wizard]によるシナリオを作成する |
ウィザードの実行が完了すると、テスト・プロジェクトに2つのソース・ファイルが追加される。1つは実際のテストに直接関係するWebサービスの呼び出しをそのままコードにしたテスト・コード(WCFTest1.csファイル)。もう1つはテストの初期化などを行うスタブ・コード(WCFTest1.Custom.csファイル)。
生成されたコードはVisual Studioの通常の単体テストのそれと変わらないので、特徴的なところだけを解説する。以下は、生成されたテスト・コードの抜粋である。
|
|||||||||
テスト・コードの抜粋(WCFTest1.cs) | |||||||||
|
次はスタブ側のコードを紹介する。
|
||||||||||||
スタブ側のコード(WCFTest1.Custom.cs) | ||||||||||||
|
以上でソリューションをリビルドする。
INDEX | ||
アプリケーションのギアを上げよう ― Visual Studio 2010でアプリケーションのパフォーマンス・チューニング | ||
第5回 Webサービスのパフォーマンス・チューニング | ||
1.Webサービスのテスト・シナリオの手助けになるWCF Load Test:準備 | ||
2.Webサービスのテスト・シナリオの手助けになるWCF Load Test:実践 | ||
「アプリケーションのギアを上げよう」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|
- - PR -