Windowsのシステムのパフォーマンスカウンターを取得(typeperfコマンド)



## 経緯

Windows上にて作ったプログラム動作中のシステムの負荷状況（CPU、メモリ、通信量）などを確認したいけど、
Windows標準のタスクマネージャーや、リソースモニターを目視で確認してもログとしては使いにくいので、
何かないか調べたところ、`typeperf`コマンドを使えば、同様の情報を拾えて、CSV形式にに保存できそうでしたので、
使い方を調べて使ってみました。

## パフォーマンスカウンターの一覧取得

`typeperf`コマンドで監視できる対象（パフォーマンスカウンター）は大量にあります。
以下コマンドにて、パフォーマンスカウンター一覧を表示することができます。


以下に何パターンかコマンド例を記載します。

**オブジェクトの一覧表示**
インスタンスが存在する場合は`(*)`表示で省略されます。

```bat:全オブジェクトのカウンタ一覧
typeperf -q
```
```bat:指定したオブジェクトのカウンタ一覧
typeperf -q  オブジェクト名
```
```bat:実行例(processorオブジェクトを指定時)
> typeperf -q  "processor"
\processor(*)\% Processor Time
\processor(*)\% User Time
\processor(*)\% Privileged Time
\processor(*)\Interrupts/sec
\processor(*)\% DPC Time
\processor(*)\% Interrupt Time
\processor(*)\DPCs Queued/sec
\processor(*)\DPC Rate
\processor(*)\% Idle Time
\processor(*)\% C1 Time
\processor(*)\% C2 Time
\processor(*)\% C3 Time
\processor(*)\C1 Transitions/sec
\processor(*)\C2 Transitions/sec
\processor(*)\C3 Transitions/sec
```

**オブジェクト・インスタンスの一覧表示**

```bat:全オブジェクトのインスタンス・カウンタ一覧
typeperf -qx
```
```bat:指定したオブジェクトのインスタンス・カウンタ一覧
typeperf -qx  オブジェクト名
```
```bat:実行例(processorオブジェクトを指定時)
> typeperf -qx  "processor"
\processor(0)\% Processor Time
\processor(1)\% Processor Time
\processor(2)\% Processor Time
\processor(3)\% Processor Time
\processor(4)\% Processor Time
\processor(5)\% Processor Time
\processor(6)\% Processor Time
\processor(7)\% Processor Time
\processor(_Total)\% Processor Time
\processor(0)\% User Time
\processor(1)\% User Time
\processor(2)\% User Time
～～～～～大量に出るので省略～～～～～
\processor(4)\C3 Transitions/sec
\processor(5)\C3 Transitions/sec
\processor(6)\C3 Transitions/sec
\processor(7)\C3 Transitions/sec
\processor(_Total)\C3 Transitions/sec
```

## パフォーマンスカウンターの監視を実施


```bat:パフォーマンスカウンターの監視
typeperf   "パフォーマンスカウンター名"
```

- 複数のパフォーマンスカウンタを出したい場合は、続けて記載する
- インスタンス部分に`(*)`とした場合は、全インスタンスを指定となる
- `Ctrl+C`を押すまでサンプリング継続される

```bat:実行例(CPUトータルの使用率+CPUトータルの待機時間率)
> typeperf  "\processor(_Total)\% Processor Time"  "\processor(_Total)\% Idle Time"

"(PDH-CSV 4.0)","\\XXXXXXXX\processor(_Total)\% Processor Time","\\XXXXXXXX\processor(_Total)\% Idle Time"
"12/13/2020 20:41:12.395","7.149553","89.955455"
"12/13/2020 20:41:13.404","6.673767","90.668151"
"12/13/2020 20:41:14.415","7.438474","91.027614"
"12/13/2020 20:41:15.418","6.678228","91.790523"
"12/13/2020 20:41:16.427","4.955068","91.664405"
"12/13/2020 20:41:17.429","6.121536","90.849692"
"12/13/2020 20:41:18.432","5.840923","91.207533"
"12/13/2020 20:41:19.436","6.975601","90.252590"
"12/13/2020 20:41:20.438","19.165862","79.704914"
"12/13/2020 20:41:21.450","14.454969","84.504989"
"12/13/2020 20:41:22.473","8.685111","88.117535"
"12/13/2020 20:41:23.479","12.503927","85.379233"
"12/13/2020 20:41:24.482","12.084388","86.591503"
"12/13/2020 20:41:25.492","21.662629","76.774804"
"12/13/2020 20:41:26.501","11.150328","87.014298"
"12/13/2020 20:41:27.508","12.023045","87.517754"
"12/13/2020 20:41:28.511","5.474416","91.997837"
```

- サンプリングレートや出力形式などはオプションで指定可能なので、いじりたい場合はヘルプ`-?`を見て使ってみてください。


## 利用できそうなパフォーマンスカウンター

| パフォーマンスカウンター名 | 内容 |
|----|----|
| \processor(_Total)\% Processor Time | CPU使用率(トータル) |
| \processor(*)\% Processor Time      | CPU使用率(各CPU毎) |
| \System\Processor Queue Length      | CPU空き待ちスレッド数 |
| \Network Interface(*)\Bytes Total/sec    | ネットワーク/インタフェース毎の 送受信速度 |
| \Network Interface(*)\Bytes Received/sec | ネットワーク/インタフェース毎の 受信速度   |
| \Network Interface(*)\Bytes Sent/sec     | ネットワーク/インタフェース毎の 送信速度   |
| \Network Adapter(*)\Bytes Total/sec      | ネットワーク/アダプタ毎の 送受信速度 |
| \Network Adapter(*)\Bytes Received/sec   | ネットワーク/アダプタ毎の 受信速度   |
| \Network Adapter(*)\Bytes Sent/sec       | ネットワーク/アダプタ毎の 送信速度   |
| \Memory\Available MBytes | メモリ/利用可能な物理メモリ量(残容量) |
| \Memory\Cache Faults/sec | メモリ/キャッシュFault発生回数 |
| \Memory\Pages/sec        | メモリ/ページング発生回数 |
| \PhysicalDisk(*)\% Idle Time         | 物理ディスクのアイドル時間率 |
| \PhysicalDisk(*)\Disk Reads/sec      | 物理ディスクの読込要求数 |
| \PhysicalDisk(*)\Disk Writes/sec      | 物理ディスクの書込要求数 |
| \PhysicalDisk(*)\Disk Read Bytes/sec  | 物理ディスクの読込速度 |
| \PhysicalDisk(*)\Disk Write Bytes/sec | 物理ディスクの書込速度 |


## 参考

- [Windowsのtypeperfコマンドでシステムのパフォーマンスカウンタのデータを収集する：Tech TIPS - ＠IT](https://www.atmarkit.co.jp/ait/articles/0911/13/news105.html)
- [HP パフォーマンス監視ベスト・プラクティス](https://softwaresupport.softwaregrp.com/doc/KM01413233?fileName=ALM12.20_PC_PerformanceMonitoring_BP_ja.pdf)