社内PCのサポートをしていて困るのが、PCが遅いので何とかして欲しいと言われること。
DOS時代のPCが遅いという意味は、実際CPUが遅かったりHDDへアクセス中だったわけですが、マルチタスクOSで、SSDで、ネットワーク時代の今では「遅い」という意味は、ユーザーの使い方を調べてみないと分かりません。
遅い理由としては、
- 実際にCPUが100%負荷
- メモリ空き容量がない
- HDDへのアクセス待ち(仮想記憶、データへのアクセス)
- 必要なデータ待ち(ネットワークの向こう側からデータが届くのを待っている)
などが考えられます。
この中で、1のCPU負荷と2のメモリ使用率はPowershellを使えば比較的簡単に知ることができます。
もしメモリ使用率が100%付近に近づくと、スワップが発生するため3の仮想記憶へのアクセスを測定する必要が出て来ます。これは、結構大変。理由は、一口にHDDへのアクセスと言っても、データベースなどの巨大データがHDD上にあり検索に時間が掛かるケースと、メモリ容量が不足していてスワップアウト、スワップインが頻繁に発生している場合、これらの複合ケースであり、計測だけでなく解析が必要になるためです。HDDへのアクセス回数を計測することは出来るのですが、計測した情報がPCの速度に影響しているかどうかは断言できません。HDDに関してはSSDに換装することで高速化を図れますので、HDDアクセスランプが点きっぱなしの場合は、計測よりもSSDに換装して再チャレンジするのが良さそうです。
4のネットワークの向こうのデータ待ちとなると、計測するポイントがありません。例えば、CMSで動いているWebページへアクセスして、その結果が帰ってこなければデータを入力出来ないようなケース。原因はネットワークの向こう側にあるWebサーバーが遅いことなので、ローカルでは何も出来ません。
とりあえず、CPU負荷率とメモリ空き容量を確認して、どちらも低ければ、遅い理由はHDDかネットワークかサーバーのせいということにせざるを得ないでしょう。
そして、PCのリソースを計測するための小さなスクリプトの作成。
計測はリモートから一定間隔間隔でコマンドを発行し続けるように while loop で組んでみました。
Get-Credential に関しては、前のメモを参照のこと。
$c = Get-Credential
while(1){
gwmi -ComputerName win10_01 -Credential $c Win32_PerfFormattedData_PerfOS_Processor | Select Name,PercentProcessorTime |Out-String
gwmi -ComputerName win10_01 -Credential $c Win32_OperatingSystem | %{(($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)/$_.TotalVisibleMemorySize) * 100}
# 使用しませんが、現在動いているタスク一覧を取る行
# gwmi -ComputerName win10_01 -Credential $c win32_process | select ProcessId,Name,CommandLine |Out-String
sleep 10
}
結果は、以下。(4スレッドの Core i5の場合)
Name PercentProcessorTime ---- -------------------- 0 100 1 100 2 100 3 100 _Total 100 48.8978633036571
CPUはフル稼働(100%)ですが、メモリの使用率は50%程度なので、スワップはあまり発生していないようです。
上の、スクリプトでは、ループはしてくれますけど、記録はしてくれないので画面を監視し続けるか、表示データをファイルに落とせるように組み直す必要があります。
そのままファイルに落としても、計算処理向きでは無いので、CSV形式で保存するようにしたり、タイムスタンプを入れたり、まだまだ工夫が必要になりますね。