はじめに
サーバの運用管理をしていると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
タスクスケジューラを使う
実行間隔は5分にしています。ここは状況に応じて任意に変更して下さい。
23:00~0:00なので継続時間を1時間にしています。
動作確認
23:00から5分ごとにプロセスのCPU使用率がCSV形式で書き出されます。
コメント