アプリケーションのギアを上げよう
― Visual Studio 2010でアプリケーションのパフォーマンス・チューニング ―

第1回 OS機能によるアプリのパフォーマンス測定

亀川 和史
2011/04/08
Page1 Page2 Page3

 「作ったプログラムが何となく遅い」「プログラムが遅いけれど、何が原因か分からない」という話をよく聞く。これに対して本稿では、いくつかの典型的な例での対処方法や、実際にVisual StudioやWindowsからどのように性能測定を行うかについて紹介する。

OSパフォーマンス測定

 完成したプログラムを負荷試験や限りなく本番に近い状態で実行するとき、性能測定は行っているだろうか? テスト・ツールによっては、負荷をかけるテストと同時にアプリケーションの性能情報を採取してくれるものもあるが、Windowsの標準機能でも詳細な性能情報を取得できる。

パフォーマンス・モニタとは?

 Windows NT 3.1登場以降、標準で搭載されているパフォーマンス・モニタは、Windowsにおいて性能情報を採取するための基本ツールである。Windows 7にも搭載されており、より使いやすくなっている。パフォーマンス・モニタ(perfmon.exe)は、[コントロール パネル]−[システムとセキュリティ]−[管理ツール]−[パフォーマンス モニター]から起動できる。

 ちなみに、(タスクバーの右クリック・メニューの[タスク マネージャーの起動]から起動できる)タスク・マネージャの[パフォーマンス]タブにあるボタンから表示できる「リソース モニター」は、(新しいツールのように思われている場合があるが)従来からあるパフォーマンス・モニタの表示を変更したものである。試しにタスク・マネージャから「perfmon.exe」を終了させると、リソース・モニタも終了することが分かる。

 パフォーマンス・モニタは非常に多くの測定項目を採取できる(そのため、どの情報を採取すればいいか分からなかったり、無駄な情報を採取していたりすることがあるかもしれない)。また、Windows Vista以降ではパフォーマンス・モニタが改善され、手軽に情報の採取ができるようになっている。「何となく遅い」という場合に、まずはパフォーマンス・モニタでレポートを作成すれば、どこに時間がかかっているか分かるだろう。

 詳細な手順は、以下のTIPSに掲載されているので参考にしてほしい。

パフォーマンス・モニタを使った性能問題の調査

 まずはパフォーマンス・モニタで「システム パフォーマンス」のレポートを作成する。具体的には左側ペインのツリー表示にある[データ コレクター セット]−[システム]−[System Performance (システム パフォーマンス)]項目の右クリック・メニューから[開始]を選択する(すでに開始済みの場合は不要)。これにより、レポート作成が開始され、そのレポート項目がツリー表示の[レポート]−[システム]−[System Performance]の直下に表示されるので、これを選択する。そして次の画面のように、右側ペインの[診断結果]欄で具体的にCPU、メモリ、ネットワーク、ディスクのいずれに性能問題があるかを確認しよう。

パフォーマンス・モニタで採取した直近60秒のシステム性能の診断結果
この例では緑色ですべて問題ない状態になっているが、性能が低下していると思われるものは黄色から赤色に変化する。

 性能問題の原因を調べるには、実際に赤色になった項目を確認していくことになるが、パフォーマンス・モニタでは最終的に集計された平均値になっているため、ある瞬間の性能やそのとき実行していたプログラムを特定しにくい。

 しかしながらパフォーマンス・モニタでは、詳細なデータが時系列のイベント・トレース情報として保存されているので、これを読み取れる別のツールを使って解析してみよう。

Windows Performance Toolkitによる時系列データの読み取り

 今回は、「Microsoft Windows Performance Toolkit」を使って、この情報を読み取ってみよう。なお、このツールキットは、以前は単体配布されていたが、現在はWindows SDKに付属している。

 Windows SDKページの[Install Now]でWebからのインストールが行えるが、回線に余裕がある場合以外はISOイメージをダウンロードした方が快適だろう。執筆時点の最新版は「Windows SDK for Windows 7 and .NET Framework 4」である。ISOイメージをCDやDVDに焼かずに使用する方法もあるので、詳しくは下記のTIPSを参考にしてほしい。

【関連サイトおよびリソース】:

 Windows SDK([Install Options]ページで[Windows Performance Toolkit]にチェックを入れておく必要がある)をインストールすると、次の画面のように[スタート]メニューの[すべてのプログラム]−[Microsoft Windows Performance Toolkit]というプログラム・グループの中に[Performance Analyzer]があるので、起動する。

[Performance Analyzer]メニュー

 起動すると、以下の画面が表示される。

Performance Analyzerの起動画面

 Performance Analyzer(正式には「Windows Performance Analyzer」で、「WPA」と略される)では、先ほどのパフォーマンス・モニタで採取したレポートを下記の手順で読み込ませることができる。

(1)(メニューバーの)[File]メニューの[Open]を選択して、[Open Trace]ダイアログを表示する
(2)[Open Trace]ダイアログで、パフォーマンス・モニタが記録した.etlファイルを指定して[開く]ボタンをクリックする。既定では、「C:\PerfLogs\System\Performance」フォルダ配下に作成された「コンピュータ名_日付_連番」というフォルダ名の下に「NtKernel.etl」というファイルがあるので、これを指定すればよい([Open Trace]ダイアログでは、管理者権限を持つユーザーでも、フォルダごとに「アクセス権の取得」のための確認ダイアログが表示される)

 NtKernel.etlファイル(=パフォーマンス・モニタのSystem Performanceのレポート結果)を読み込むと、以下のようにグラフィカルに時系列データが表示される。もちろんパフォーマンス・モニタで採取したタイミングの.etlファイルを使用するため、一度保存したレポートはいつ読み込んでも同じグラフになる。

Performance Analyzerによる時系列データの表示
NtKernel.etlファイルを読み込むと、このようにレポート採取時点のグラフィカルな時系列データが表示される。
  [Disk I/O]ビュー:ディスクI/O回数を時系列で並べたもの。
  [Disk Utilization]ビュー:ディスクの使用率。
  [Process Lifetimes]ビュー:そのとき実行されていたアプリケーション。
  監視項目の表示/非表示を切り替えるためのUI(ユーザー・インターフェイス)を表示する。
  突出しているところ。

 上の「時系列データの表示」ではの部分が突出している。この領域をもう少し詳細に調べたいと思った場合、マウス・カーソルで画面上の知りたい範囲をクリック&ドラッグで範囲選択を行う。すると、次の画面のように薄い青色で範囲指定が行われる。なお、この範囲選択の操作は、[Disk I/O]ビューのグラフだけではなく、[Disk Utilization][Process Lifetime]のいずれのグラフ・ビューでも有効な操作である。

知りたい範囲をクリック&ドラッグで範囲選択

 この状態から、選択された範囲の上で右クリックして、(表示されるコンテキスト・メニューから)[Zoom to Selection]を選択すると、その範囲だけが拡大表示される。以下の画面はその実行例である。

選択範囲に対する各種操作が行えるコンテキスト・メニュー
このコンテキスト・メニューは、選択された範囲の上で右クリックすると表示される。
  選択範囲を拡大表示する。
  選択範囲を(ほかのグラフにも)複製する。
  ズーム状態を解除する。
  ビュー全体(この場合は[Disk I/O]ビュー)を選択する。
  開始時間と終了時間の数値(「s」を数値の語尾に付けると単位は「秒」)を指定して範囲選択を行う。
  前面に表示する。
  Windowsのシンボルをロードする。シンボル・サーバの設定が必要(後述)。
  ほかのグラフと重ね合わせを行う。
  概要テーブルを表示する。
  グラフの詳細を表示する。

 実際にコンテキスト・メニューから[Zoom To Selection]を選択すると、次の画面のように、範囲選択した領域が拡大表示され、さらに詳細な時間軸で確認することができる。

範囲選択した領域が拡大表示されている例

 以上のように、Performance Analyzerにパフォーマンス・モニタのSystem Performanceのレポート結果(=NtKernel.etlファイル)を読み込ませた場合、ディスクとプロセスの使用率が表示される。

 このPerformance Analyzerのほか、Windows SDKに含まれている「xperf.exe」というコマンドライン・ツールを使えば、カーネルやアプリケーションのイベント・トレース・データを採取できる。

 ただし、Windows XPおよびWindows Server 2003では、Windows SDKインストールしてもxperf.exeファイルのインストールは行われないので注意してほしい。これらのWindows OSでxperf.exeファイルをインストールしたい場合は、一度、Vista以降のWindows OSにWindows SDKをインストールした後、各種ツールがインストールされているフォルダ(=標準では「C:\Program Files\Microsoft Windows Performance Toolkit」にあるフォルダ)を丸ごと(Windows XPやWindows Server 2003に)コピーする必要がある。コピーした後、特にインストールの設定などを行う必要はない。

 もう1つの注意点として、64bit版のWindows SDKには64bit版のツール(Performance Analyzerなど)しかインストールされない。従って、64bit版のWindows SDKをインストールしたコンピュータから32bit版のWindows XPへツール(Performance Analyzerなど)をコピーして実行すると、「有効なWin32アプリケーションではありません」というエラーが出るので、注意が必要である。

 以下では、このxperf.exeファイルを用いたWindowsイベントのトレース・データの採取方法を説明していく。


 INDEX
  アプリケーションのギアを上げよう ― Visual Studio 2010でアプリケーションのパフォーマンス・チューニング
  第1回 OS機能によるアプリのパフォーマンス測定
  1.パフォーマンス・モニタとWindows Performance Toolkitによる性能問題の分析
    2.Event Tracing for Windows(ETW)によるイベント・トレース・データの採取/分析
    3.スタック情報による詳細なイベント・トレース・データの採取/分析

インデックス・ページヘ 「アプリケーションのギアを上げよう」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH