Introduction

Windows でプログラムのパフォーマンス、特にメモリ使用量を計測しようとしたら、JetbrainsdotMemory が鉄板だが、.NET に特化しすぎている。

Windows に標準で備わっている パフォーマンスモニタ (Perfmon.exe) もあるわけだが、これが使いにくいことこの上ない。

計測できる項目が多すぎて探すのが面倒だし、何よりも気に入らないのが、既に起動中のプロセスしか選択できない点。
(ひょっとしたら出来るのかもしれないが)

そんなパフォーマンスモニタだが、コマンドラインが用意されていて、こっちはお手軽に使える。

How to use?

typeperf.exe がコマンドライン。
下記はヘルプ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
> typeperf /h

Microsoft ® TypePerf.exe (10.0.22000.1165)

Typeperf は、パフォーマンス データをコマンド ウィンドウまたはログ ファイルに書き込みます。Typeperf を停止するには、
Ctrl+C キーを押します。

使い方:
typeperf { <カウンター [カウンター ...]> | -cf <ファイル名> | -q [オブジェクト] | -qx [オブジェクト] } [オプション]

パラメーター:
<カウンター [カウンター ...]> 監視するパフォーマンス カウンターです。

オプション:
-? 状況に応じたヘルプを表示します。
-f <CSV|TSV|BIN|SQL> 出力ファイルの形式です。既定は CSV です。
-cf <ファイル名> 監視するパフォーマンス カウンターを含んでいるファイルです。1 行に 1 カウンターです。
-si <[[hh:]mm:]ss> サンプリングの間隔です。既定値は、1 秒です。
-o <ファイル名> 出力ファイルまたは SQL データベースのパスです。既定値は、STDOUT です。
-q [オブジェクト] インストールされているカウンターの一覧を表示します (インスタンスなし)。1 つのオブジェ
クトに対するカウンターを一覧表示するには、Processor のようにオブジェクト名を含めてく
ださい。
-qx [オブジェクト] インストールされているインスタンスの一覧を表示します。1 つのオブジェクトに対するカウ
ンターを一覧表示するには、Processor のようにオブジェクト名を含めてください。
-sc <サンプリング> 収集するサンプリングの数です。既定値は、
Ctrl+C を押すまでのサンプリングです。
-config <ファイル名> コマンド オプションが記述されている設定ファイルです。
-s <コンピューター名> カウンターのパスにサーバーが指定されていない場合に監視するサーバーです。
-y すべての質問に対して確認を求めずに、"はい" で応答します。

注意:
カウンターは、"\\Server1\Processor(0)\% User Time" のような
"\\<コンピューター>\<オブジェクト>(<インスタンス>)\<カウンター>" 形式の
パフォーマンス カウンターの完全な名前です。

例:
typeperf "\Processor(_Total)\% Processor Time"
typeperf -cf counters.txt -si 5 -sc 50 -f TSV -o domain2.tsv
typeperf -qx PhysicalDisk -o counters.txt

パフォーマンス カウンターは計測する項目の事。
例えば、メモリに関することなら

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
> typeperf -qx Memory
\Memory\Page Faults/sec
\Memory\Available Bytes
\Memory\Committed Bytes
\Memory\Commit Limit
\Memory\Write Copies/sec
\Memory\Transition Faults/sec
\Memory\Cache Faults/sec
\Memory\Demand Zero Faults/sec
\Memory\Pages/sec
\Memory\Pages Input/sec
\Memory\Page Reads/sec
\Memory\Pages Output/sec
\Memory\Pool Paged Bytes
\Memory\Pool Nonpaged Bytes
\Memory\Page Writes/sec
\Memory\Pool Paged Allocs
\Memory\Pool Nonpaged Allocs
\Memory\Free System Page Table Entries
\Memory\Cache Bytes
\Memory\Cache Bytes Peak
\Memory\Pool Paged Resident Bytes
\Memory\System Code Total Bytes
\Memory\System Code Resident Bytes
\Memory\System Driver Total Bytes
\Memory\System Driver Resident Bytes
\Memory\System Cache Resident Bytes
\Memory\% Committed Bytes In Use
\Memory\Available KBytes
\Memory\Available MBytes
\Memory\Transition Pages RePurposed/sec
\Memory\Free & Zero Page List Bytes
\Memory\Modified Page List Bytes
\Memory\Standby Cache Reserve Bytes
\Memory\Standby Cache Normal Priority Bytes
\Memory\Standby Cache Core Bytes
\Memory\Long-Term Average Standby Cache Lifetime (s)

がある。
これらをコマンドで直接指定してもいいし、テキストに貼り付けて読み込ませるのもいい。

まだ起動していないプロセスを指定し、起動直後から計測を行うことも可能。
例えば Google Chrome の使用メモリを 1 秒間隔で監視し、csv に吐き出してみる。
シェルを立ち上げ

1
> typeperf "Process(chrome)\Private Bytes" -si 1 -o counter.csv

と入力し、Google Chrome を起動する。
しばらくしてから、Google Chrome を終了し、typeperfを Ctrl+C で停止。

Before

吐き出された監視結果は下記。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
"(PDH-CSV 4.0) (","\\XXXX-PC\Process(chrome)\Private Bytes"
"03/11/2023 00:58:24.973"," "
"03/11/2023 00:58:25.988"," "
"03/11/2023 00:58:27.006"," "
"03/11/2023 00:58:28.015","57843712"
"03/11/2023 00:58:29.024","59211776"
"03/11/2023 00:58:30.041","59195392"
"03/11/2023 00:58:31.056","61476864"
"03/11/2023 00:58:32.071","62447616"
"03/11/2023 00:58:33.080","64647168"
"03/11/2023 00:58:34.098","64647168"
"03/11/2023 00:58:35.115","64573440"
"03/11/2023 00:58:36.130","64573440"
"03/11/2023 00:58:37.141","64573440"
"03/11/2023 00:58:38.159","65208320"
"03/11/2023 00:58:39.171","65208320"
"03/11/2023 00:58:40.189","65220608"
"03/11/2023 00:58:41.203","65220608"
"03/11/2023 00:58:42.217","65204224"
"03/11/2023 00:58:43.234"," "
"03/11/2023 00:58:44.246"," "

実にお手軽。