EternalWindows
PDH / パフォーマンスデータ

コンピュータの管理者にとって、そのコンピュータの現在の状態、 即ちパフォーマンスは常に意識しておくべきことだといえます。 ここで言うパフォーマンスとは、CPUやネットワークの使用率、 プロセスの数やメモリの読み書き数といった非常に狭義なもので、 それらの値はアプリケーションの実行速度に大きな影響を及ぼします。 たとえば、複数のプロセスがCPUを長時間費やす処理を行う場合、 個々のプロセス(スレッド)に割り当てられるCPU時間の頻度は その分少なくなりますから、処理に掛かる時間は延びることなり、 それは結果的にコンピュータのパフォーマンスが低下しているといえるでしょう。 リアルタイムで変化する数多くのパフォーマンスを一元管理すべく、 Windowsには専用のパフォーマンスモニタリングツールが付属しています。

上図は、コントロールパネル/管理ツール/パフォーマンスから表示することができます。 グラフにて表示されている線はカウンタの現在値を表しており、 モニタされているオブジェクトは、ウインドウ右下のリストビューから確認できます。 1つのオブジェクトはそれが定義する属性(カウンタ)を公開することができ、 上図の例であれば、プロセスというオブジェクトの% ProesserTime(CPU使用率)という カウンタをモニタしていること意味しています。 パフォーマンスデータというのは、このオブジェクトとカウンタという概念で取得できる 一連のデータの事を指しており、アプリケーションは主としてそれへのアクセスを PDH(Performance Data Helper)と呼ばれる関数群で行うことになります。

PDHによるパフォーマンスモニタリングの大きな特徴として、 個々のオブジェクトやカウンタ毎に関数が定義されていないことが挙げられます。 PDHにはデータ収集用の関数が用意されており、この関数を呼び出すだけで、 予め選択していたカウンタの値を初期化することができるようになっています。 このため、一度PDHの使い方を覚えればどのようなオブジェクトであれ 統一的な手順でカウンタの値を取得することができるため、 オブジェクトの詳細などを事前に理解しておく必要は全くありません。 また、PDHでモニタできる一部のオブジェクトの情報は、 通常のWindowsAPIでは取得できないことが多々あるため、 探し求めていた関数の代わりを務めることができるかもしれません。

HKEY_PERFORMANCE_DATAについて

PDHがどのようにしてオブジェクトからデータを取得しているのかを考えたとき、 レジストリのHKEY_PERFORMANCE_DATAキーが大きなヒントなります。 そもそも、このキーはレジストリに実際に存在するわけではないため、 レジストリがパフォーマンスデータを維持していると誤認されがちですが、 パフォーマンスDLLへのアクセスにはこのキーを利用する以外に方法はありません。 パフォーマンスDLLというのは、オブジェクトを実装するDLL、 もしくはオブジェクトから取得したデータを公開するDLLであり、 それがエクスポートしている関数を呼び出すのが、 HKEY_PERFORMANCE_DATAを指定したレジストリ関数です。 何故、わざわざHKEY_PERFORMANCE_DATAというキーを用意して、 レジストリ関数をパフォーマンスDLLへのアクセスに使うのかについては、 リモートコンピュータへのアクセスをレジストリが考慮しているからだと思われますが、 いずれにせよ、レジストリ関数によるパフォーマンスデータの取得は 概念的に馴染みにくく、手続きの多さもかなりの量となっています。 PDHがこのような複雑な背景を開発者から隠蔽できているのは、 それがHKEY_PERFORMANCE_DATAを指定したレジストリ関数の上位層だからであり、 内部でレジストリ関数を使ってパフォーマンスDLLにアクセスしているからなのです。



戻る