LoginSignup
5
4

More than 5 years have passed since last update.

PowerShellでプロセスごとのCPU使用率を取得する

Last updated at Posted at 2016-10-07

プロセスごとのCPU使用率の取得って簡単とおもいきや…

意外にはまったのでメモ。
結論はGet-Counterがいちばん正確。

コード

################
#プロセスIDを取得
################
#プロセスのコマンドラインからとるならこっち
$procId = Get-WmiObject win32_process | ? {$_.commandline -like "*[コマンドラインに含まれる文字列]*"} | select Handle
#プロセスの名称からとるならこっち
$procId = Get-WmiObject win32_process | ? {$_.Caption -like "*[名称に含まれる文字列]*"} | select Handle
################
#プロセスIDからプロセス名を取得
################
$procName=(Get-Process -Id ${procId}.Handle).Name
################
#Get-CounterでCPU使用率取得
################
$perCpu = ((Get-Counter "\Process(${procName})\% Processor Time").CounterSamples).CookedValue
################
#マルチコアCPUの場合は、CPU使用率を論理コア数で割る。
#$env:NUMBER_OF_PROCESSORSはマシンの論理コア数を取得できる。
################
$perCpu = $perCpu / ($env:NUMBER_OF_PROCESSORS)

Win32_PerfFormattedData_PerfProc_Processの悪い点

PercentProcessorTimeでもCPU使用率は取得できるが、マルチコア環境だと難しそう。
PercentProcessorTimeが100%に張り付いている状態でもタスクマネージャーは25%で推移する。(4コア環境)

じゃあ、値をコア数で割ればいいかと考えるが、PercentProcessorTimeは100%以上まで上がらない。
このあたりの挙動をみると、シングルコアの値しか取ってきていないっぽい。

ならば、各CPUの負荷を取って合算しようかとも思ったけど、取り方が見つからない。
ここでお手上げで、複数CPUに負荷が散るような処理では正確なCPU使用率が取れないという結論に達した。
なんか方法はありそうだけど、力及ばず。

参考にしたページ

ありがとうございます。助かりました。
http://tech.guitarrapc.com/entry/2013/01/08/030100

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4