🗂

Windows プロセスのCPU使用率を取得する

2021/10/18に公開

色々試したことをめも

サーバのCPU負荷が高いときに、CPU負荷の高いプロセスを特定したい。
できれば、スレッド(スタック)まで特定したい

※スレッド(スタック)まではCUIでは無理だった。GUiならプロセスエクスプローラで可能

  1. Windowsのパフォーマンスモニター (パフォーマンスカウンター、データコレクターセット)

各プロセスのProcessor Timeを5分おきなどで取得

  1. DOSコマンド
    WMIC PROCESSコマンド
> WMIC PROCESS GET Name,ProcessId,CommandLine /FORMAT:LIST

出力例

CommandLine=
Name=System Idle Process
ProcessId=0

CommandLine=
Name=System
ProcessId=4
...

WMIC PATHコマンド

> WMIC PATH Win32_PerfFormattedData_PerfProc_Process WHERE "PercentUserTime > 1" GET Name,IDProcess,PercentUserTime /FORMAT:LIST

※CPU使用率が1%以上のものを取得

出力例

IDProcess=15432
Name=WmiPrvSE#4
PercentUserTime=11


IDProcess=0
Name=_Total
PercentUserTime=33


IDProcess=1812
Name=svchost#12
PercentUserTime=22

※_TotalがサーバのCPU使用率

  1. PSTools (SysInternals)
    プロセスごとのCPU使用時間とメモリ取れる。ただ、CPU使用時間(OS起動~?)は扱いづらい。WMIC PATHの方が直感的。メモリ使用量の確認には良さそう

xつけない場合、プロセスごとのCPU使用率

> pslist

出力例

Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time
Idle                  0   0   4    0     60   164:32:32.671   109:03:24.688
System                4   8 206 5237    292     2:20:36.812   109:03:24.688
Secure System        56   8   0    0    184     0:00:00.000   109:03:27.597
Registry            104   8   4    0   9764     0:00:10.859   109:03:27.546
smss                520  11   2   53   1060     0:00:00.359   109:03:24.677
csrss               688  13  11  832   1980     0:00:10.625   109:03:17.056
wininit             912  13   1  177   1548     0:00:00.406   109:03:16.694
services            580   9   8  790   7208     0:03:10.703   109:03:16.518
LsaIso                8   8   1   51   1456     0:00:01.265   109:03:16.465
lsass               712   9  11 1810  16316     0:03:33.062   109:03:16.453
svchost             872   8  22 1939  26820     0:06:40.015   109:03:15.749
fontdrvhost         960   8   5   43   5456     0:00:00.312   109:03:15.719
WUDFHost           1032   8   5  242   5112     0:00:00.265   109:03:15.634

-xつけると、プロセスごとに、全スレッドのCPU使用時間とメモリ使用量。

> pslist -x

出力例

Name                Pid      VM      WS    Priv Priv Pk   Faults   NonP Page
Idle                  0       8       8      60      60        9      0    0
 Tid Pri    Cswtch            State     User Time   Kernel Time   Elapsed Time
   0   0 172871901          Running  0:00:00.000  40:41:46.093    0:00:00.000
   0   0 138099114          Running  0:00:00.000  41:49:38.093    0:00:00.000
   0   0 180243355          Running  0:00:00.000  40:39:26.640    0:00:00.000
   0   0 121194024          Running  0:00:00.000  41:14:49.031    0:00:00.000

Name                Pid      VM      WS    Priv Priv Pk   Faults   NonP Page
System                4   53428     136     292     360   141583      0    0
 Tid Pri    Cswtch            State     User Time   Kernel Time   Elapsed Time
  12  13      2003   Wait:Executive  0:00:00.000   0:00:00.578 3688620:21:28.298
  16  14     14372   Wait:Executive  0:00:00.000   0:00:02.671 3688620:21:28.298
  20  13     15195   Wait:Executive  0:00:00.000   0:00:02.546 3688620:21:28.298
  24  16   2431794   Wait:Executive  0:00:00.000   0:00:43.046 3688620:21:28.298
  28  12      6309   Wait:Executive  0:00:00.000   0:00:00.281  109:01:10.272
...
  1. ProcessMonitor
    GUI ONLYだが、スレッドごとのCPU使用率、スタックがリアルタイム出力され最強。
    ただ、スタックを追っかけられる実行環境(Javaのスレッドダンプと突き合わせるなど)なら調査に役立つけど、対象がプロプライエタリなプロセス(商用OS/MW/ウィルス対策ソフト/監視エージェントなど)だとスレッド/スタックまで特定しても手がかりがないのでつらそう(メーカーサポートがあれば問い合わせ次第か)

Discussion