パフォーマンスモニタの仕組み
システム診断をする場合によく使われるのがパフォーマンスモニタです。
しかし、パフォーマンスモニターを利用して 「自前の」 プログラムのパフォーマンス診断を行うことは、 意外と行われていないように思われます。
その一因はやはり実装がやや複雑であることが挙げられるでしょう。
パフォーマンスデータはパフォーマンスモニタを用いて一元的にデータを管理できる他、 リモートマシンからもデータ収集できるような仕組みになっています。
これらを実現するために、やや複雑な仕組みになっています。特に、後述のデータ構造がヤヤコラシイです。
この資料では、まずパフォーマンスモニタの全体的な概要を説明します。 その次に、実際にパフォーマンスモニタを利用するプログラムを書いてみましょう。
パフォーマンスモニタのアーキテクチャ
パフォーマンスモニタがデータ収集する仕組みは、ローカルコンピュータ上のデータを収集する場合と、 リモートコンピュータ上のデータを収集する場合とでことなります。(そりゃそうか・・・)
パフォーマンスモニタの仕組み ~ ローカル
ローカルでパフォーマンスデータを収集する時は、次の図のような流れになります。
上図の左側 foo.exe が、これからあなたが作るプログラムで、 そのパフォーマンスデータを収集するとします。
この場合、あなたは パフォーマンス拡張 DLL (Performance Extension DLL) を実装し、かつ、レジストリを正しく構成 しなければなりません。
そして、パフォーマンス拡張 DLL は、foo.exe とパフォーマンスモニタプロセス (mmc.exe) に読み込まれます。ここで、何らかのプロセス間通信を用いて、 foo.exe がパフォーマンス拡張 DLL がパフォーマンスモニタに対して、 正しいデータを返すようにすればよいのです。
尚、パフォーマンスモニタがパフォーマンスデータを読み込むときには、 HKEY_PERFORMANCE_DATA レジストリを使ってデータを読み込みます。
パフォーマンスモニタの仕組み ~ リモート
リモートマシン間のデータ収集の場合は構成が変ります。
ローカルの場合と違って、foo.exe とパフォーマンスモニタプロセス (mmc.exe) は同じマシン上にはありませんから、同じパフォーマンス拡張 DLL を読み込むことが できません。
この状態でどのようにパフォーマンスデータを収集するかというと、次のようになります。
前述のようにパフォーマンスモニタは HKEY_PERFORMANCE_DATA というレジストリを使ってデータを読み込みます。
従って、foo.exe が動作するマシン内の Remote Registry Service (svchost.exe) がパフォーマンス拡張 DLL を 読み込みデータを収集し、パフォーマンスモニタ側からは RPC を経由してその情報を収集します。
このような仕組みでリモートマシンからのパフォーマンスデータ収集が可能となります。
レジストリの設定
HKLM\SYSTEM\CurrentControlSet\Services\AppName\Performance キー以下に上記の値を設定することで、パフォーマンスモニタにカウンタを認識させることが出来ます。
First Counter | ※ lodctr によって自動登録する。 HKLM \SOFTWARE \Microsoft \Windows NT \CurrentVersion \Perflib Perflib 以下の言語毎のキー以下の Help と Counter にオブジェクトの名前とヘルプ情報が登録される。 |
First Help | |
Last Counter | |
Last Help | |
Library | Performance Extension DLL 名 |
Open | Open 関数名 |
Close | Close 関数名 |
Collect | Collect 関数名 |
上表中に書いてありますが、いくつかのカウンターはパフォーマンスカウンタ登録用の コマンド lodctr を使って登録してください。
それでは次に、実際にパフォーマンス拡張 DLL を作成し、 パフォーマンスオブジェクトとカウンタを作成しましょう。