WindowsサーバのCPU使用率が高いプロセスを特定する方法

スポンサーリンク

はじめに

サーバの運用管理をしているとCPUやメモリ使用率が100パーセント近くになって動作が重くなることがあります。日中帯であればすぐに状況を確認して対応できますが、夜中に発生すると対応することができません。翌日の朝一に確認した時、すでに高負荷が解消されていたら原因の特定は困難です。

例えば、夜の23:00~0:00にCPU使用率が高い状況が続いている、バックアップやウィルススキャンではない、何のプロセスが動いているんだろう?

このような場合、どうやって調査するか考えないといけません。管理人はどうするかというと、PowerShellとタスクスケジューラを使います。具体的な手順をまとめておきます。

環境構築

検証サーバを構築します。

CPUStres」ツールを使ってCPU使用率を80パーセント前後にします。

PowerShellを使う

PowerShellで使用するコマンドレットは「Get-Counter」です。これは、Windowsシステムのパフォーマンスに関する計測情報を取得します。

実際にコマンドを入力した結果は以下の通り。「CookedValue」がCPU使用率ですが、2Coreのサーバなので合算値となっています。単純に2で割ればわかりやすいですね。「cpustres64」が160なので80パーセントの使用率となっています。

PS C:\> (Get-Counter "\Process(*)\% Processor Time").CounterSamples | select Path, InstanceName, Cook
edValue  | sort CookedValue -Descending

Path                                                         InstanceName              CookedValue
----                                                         ------------              -----------
\\windows2016\process(_total)\% processor time               _total               197.287648398837
\\windows2016\process(cpustres64)\% processor time           cpustres64           160.004943189608
\\windows2016\process(idle)\% processor time                 idle                   34.17581310846
\\windows2016\process(explorer)\% processor time             explorer             1.55344605038454
\\windows2016\process(zabbix_agent2)\% processor time        zabbix_agent2        1.55344605038454
\\windows2016\process(svchost#1)\% processor time            svchost                             0
\\windows2016\process(taskhostw)\% processor time            taskhostw                           0
\\windows2016\process(shellexperiencehost)\% processor time  shellexperiencehost                 0
\\windows2016\process(googlecrashhandler)\% processor time   googlecrashhandler                  0
・・・

上記のコマンドに日時の追加とCSVファイルへの書き出し処理を追加します。

PS C:\> (Get-Counter "\Process(*)\% Processor Time").CounterSamples | select @{Label="DateTime";Expression={(Get-Date)}}, Path, InstanceName, CookedValue  | sort CookedValue -Descending | Export-Csv -Encoding Default -NoTypeInformation -Append Process_CPU_Usage.csv

実行されているプロセスが表示されない場合は、以下のコマンドレットを実行して下さい。Processカウンタのインスタンスをリセットします。

Get-Counter -ListSet Process | Out-Null

タスクスケジューラを使う

実行間隔は5分にしています。ここは状況に応じて任意に変更して下さい。
23:00~0:00なので継続時間を1時間にしています。

動作確認

23:00から5分ごとにプロセスのCPU使用率がCSV形式で書き出されます。

コメント

タイトルとURLをコピーしました