パフォーマンスモニターでプロセス単位のリソース状況を記録する

パフォーマンスモニターでタスクマネージャの[プロセス]タブと同じ様な内容が記録できないか確認してみました。
理由としては「CPUとメモリを想定外に使用する原因を調査する」ことになります。
エージェント型の運用管理ツール(Zabbix等)を使用すれば対応できるかと思いますが、その様な想定が無く、トラブルが起こりますと大概はこうなります。
下図のCPUとメモリの利用状況をファイルに記録しスパイクの犯人を特定できればと思いました。

Process単位の調査はパフォーマンスモニタのProcessでエントリ可能ですので、[Process]⇒[%Processor Time]で[すべてのインスタンス]を[追加]してみます。
他にも[%User Time][%Privileged Time][Working Set]で[すべてのインスタンス]を追加しました。

blogファイルで出力したのですが、Totalのみ表示されプロセス単位では評価されていないように見えます。これでは駄目ですね。

パフォーマンスモニターの出力形式をCSVファイルに変更するとプロセス単位で記録されました。
ちなみにblogファイル出力でもrelogコマンドでcsvに変換すると、プロセス単位で記録されていました。パフォーマンスモニターのグラフィック表示には対応していないとういことなのでしょう。

[Process]⇒[%Processor Time] の列(カラム)は以下の感じです。
見やすいように縦軸に変換しています。
始めに Idle、最後に _Totalが記録されています。
ADはホスト名でProcessの次の()内がプロセス名になります。
記載が漏れましたが、検証環境はWindows 2016のActiveDirectoyを仮想環境で検証しています。

(PDH-CSV 4.0) (
\AD\Process(Idle)\% Processor Time
\AD\Process(System)\% Processor Time
\AD\Process(smss)\% Processor Time
\AD\Process(csrss#2)\% Processor Time
\AD\Process(wininit)\% Processor Time
\AD\Process(csrss#1)\% Processor Time
\AD\Process(winlogon#1)\% Processor Time
\AD\Process(services)\% Processor Time
\AD\Process(lsass)\% Processor Time
\AD\Process(svchost#14)\% Processor Time
——-中略——-
\AD\Process(winlogon)\% Processor Time
\AD\Process(dwm)\% Processor Time
\AD\Process(rdpclip)\% Processor Time
\AD\Process(RuntimeBroker)\% Processor Time
\AD\Process(sihost)\% Processor Time
\AD\Process(svchost)\% Processor Time
\AD\Process(taskhostw)\% Processor Time
\AD\Process(explorer)\% Processor Time
\AD\Process(ShellExperienceHost)\% Processor Time
\AD\Process(SearchUI)\% Processor Time
\AD\Process(ImeBroker)\% Processor Time
\AD\Process(ApplicationFrameHost)\% Processor Time
\AD\Process(mmc)\% Processor Time
\AD\Process(MSASCui)\% Processor Time
\AD\Process(MSASCuiL)\% Processor Time
\AD\Process(WmiApSrv)\% Processor Time
\AD\Process(rundll32)\% Processor Time
\AD\Process(_Total)\% Processor Time

これでプロセス単位で行けるかと思ったのですが、パフォーマンスモニターを24時間取得して場合、開始時に存在しないプロセスが起動することが考えられますので、CPUSTRESSの起動と停止をしてみて途中からログ(カラム)に追加されれるか確認しました。

Idleの値に変化があるため、何らかのプロセスが起動したことは認識しているようですが、プロセスは記録はされません。
青の折れ線グラフ(Idel)が減っています。

パフォーマンスモニタは出力がblog(バイナリ)とcsv(テキスト)では異なった結果になることを思いだし、blogファイルで出力して、relogコマンド(変換方法の詳細は本サイトの別記事に記載していますので、サイドバーから検索して下さい)でCSVに変換して見ました。

そうすると、パフォーマンスモニター取得中に起動停止したCPUSTRESSが記録されました。

これで[タスクマネージャ]の[プロセスタブ]を常時目視することなく、リソースを消費するプロセスを特定できるかと思います。上記のグラフはExcelのリストとグラフしたものになります。

シナリオはできたのですが、犯人がsvchost.exeの場合には推測するのが困難です。
csvファイルの列(カラム)には番号があるのですが、番号とプロセスの紐付けができません。検証環境では以下のように15のsvchost.exeが記録されています。

\Process(svchost#14)\% Processor Time
\Process(svchost#13)\% Processor Time
\Process(svchost#12)\% Processor Time
\Process(svchost#11)\% Processor Time
\Process(svchost#10)\% Processor Time
\Process(svchost#9)\% Processor Time
\Process(svchost#8)\% Processor Time
\Process(svchost#7)\% Processor Time
\Process(svchost#6)\% Processor Time
\Process(svchost#5)\% Processor Time
\Process(svchost#4)\% Processor Time
\Process(svchost#3)\% Processor Time
\Process(svchost#2)\% Processor Time
\Process(svchost#1)\% Processor Time
\Process(svchost)\% Processor Time

以下のコマンドでsvchost.exeとPIDに紐付いているサービスは確認できるのですが、#番号とPIDの紐付けが解決できませんでした。
タスクマネージャですと右クリックで関連するプロセスを見ることができますが、この方法ですとリアルタイムで操作する必要があります。

tasklist /fi “imagename eq svchost.exe” /svc

まとめると

  1. パフォーマンスモニターで[Process]⇒[%Processor Time]で[すべてのインスタンス]を[追加]と [Process]⇒ [Working Set] で[すべてのインスタンス]を[追加]
  2. ログの出力をblog(バイナリ)にする
  3. 調査後、relogコマンドでblogファイルをCSVファイルに変換に変換
  4. CSVファイルをExcelに取り込み、グラフを作成してスパイク(利用率が高くなっている)が発生しているプロセスを探す

ご参考まで。

関連記事

TOP