🗂
Windows プロセスのCPU使用率を取得する
色々試したことをめも
サーバのCPU負荷が高いときに、CPU負荷の高いプロセスを特定したい。
できれば、スレッド(スタック)まで特定したい
※スレッド(スタック)まではCUIでは無理だった。GUiならプロセスエクスプローラで可能
- Windowsのパフォーマンスモニター (パフォーマンスカウンター、データコレクターセット)
各プロセスのProcessor Timeを5分おきなどで取得
- 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使用率
- 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
...
- ProcessMonitor
GUI ONLYだが、スレッドごとのCPU使用率、スタックがリアルタイム出力され最強。
ただ、スタックを追っかけられる実行環境(Javaのスレッドダンプと突き合わせるなど)なら調査に役立つけど、対象がプロプライエタリなプロセス(商用OS/MW/ウィルス対策ソフト/監視エージェントなど)だとスレッド/スタックまで特定しても手がかりがないのでつらそう(メーカーサポートがあれば問い合わせ次第か)
Discussion