##プロセスごとの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