[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [+]

パフォーマンスカウンタを眺める

Windows さんにはパフォーマンスカウンタというものがあって、 ごていねいにいろいろなことをカウントしてくれているみたいです。
あ、WindowsXP と Windows2000 で動作確認しています。


目次


パフォーマンスカウンタとは

詳しくはよくわかっていませんが、Windows さんは、 プロセッサとかプロセスとかメモリとかディスクとかネットワークとか、 あらゆるものの状態を逐一監視してくれていて、 パフォーマンスカウンタというものに値を記録してくれているようです。
# 違っていたらすみません…。

まず、大きいカテゴリとしてパフォーマンスオブジェクトというのがあります。 例えば、System, Process, Network Interface, TCP などがあります。
そして、パフォーマンスオブジェクトそれぞれに対して、カウンタがあります。 例えば、System には Processes や Threads, System Calls/sec などが、 Network Interface には Bytes Total/sec や Packets/sec などがあります。
また、System や TCP などインスタンスを持たないものと、 Process や Network Interface などインスタンスを持つものがあります。 例えば、Process は Idle, System, smss, winlogon などのインスタンスを持ちます。


パフォーマンスオブジェクトなどの一覧を知る

まずは、パフォーマンスオブジェクト、インスタンスやカウンタにどのようなものがあるのか、 一覧を出力させてみます。
パフォーマンスオブジェクトは、PdhEnumObjects() で得られます。
インスタンスとカウンタは、PdhEnumObjectItems() で得られます。 PdhEnumObjectItems() では、パフォーマンスオブジェクト名を指定します。

というわけで、サンプルはこちらです。

実行例を、以下に示します。

>pcnt_enum
...前略...

Processor
  Instance(Processor):
    0
    _Total
  Counter(Processor):
    % Processor Time
    % User Time
    % Privileged Time
    Interrupts/sec
    ...後略


パスを指定してカウンタを得る

つぎに、実際にカウンタの値を得ます。
パフォーマンスカウンタを指定するために、以下のパスを使用します。

\パフォーマンスオブジェクト名(インスタンス名)\カウンタ名

インスタンスがない場合は、(インスタンス名)を省略します。
例を以下に示します。

\Processor(0)\Interrupts/sec
\Process(Idle)\% Processor Time
\IP\Datagrams/sec
\TCP\Connections Established

実際には、まず PdhOpenQuery() でオープンし、 PdhAddCounter() で測定したいカウンタをパス名で指定します。
それから、PdhCollectQueryData() で実際の値を入手し、 PdhGetFormattedCounterValue() でお好きな形式の値に変換します。

というわけで、サンプルはこちらです。

引数にパスを指定すると、そのカウンタ値を出力します。
実行例を以下に示します。

>pcnt_count "\Processor(0)\Interrupts/sec"
\Processor(0)\Interrupts/sec = 166.056719
>pcnt_count "\TCP\Connections Established"
\TCP\Connections Established = 18.000000


ダイアログで選択してカウンタを得る

しかし、いちいちパスを指定するのは面倒です。
うれしいことに、選択のためのダイアログを表示して、 パスを得られる関数が用意されています。
PdhBrowseCounters() という関数です。 引数に PDH_BROWSE_DLG_CONFIG という構造体を渡します。

というわけで、サンプルはこちらです。

一発だけだとつまらないので、1秒毎に出力させてみました。
例えば、"\Network Interface(インタフェース名)\Bytes Total/sec" を指定すれば、 ネットワークの使用状況をを確認できます。
# GUI じゃないのでうっとおしいですが…。


参考文献

Powered by Apache PostgreSQL Usupi Logo Kuri Logo
[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [-]
usu@usupi.org Last modified : Tue Jun 22 00:26:27 2004