Powershell: リモートからPCのリソース使用状況を知りたい

社内PCのサポートをしていて困るのが、PCが遅いので何とかして欲しいと言われること。

DOS時代のPCが遅いという意味は、実際CPUが遅かったりHDDへアクセス中だったわけですが、マルチタスクOSで、SSDで、ネットワーク時代の今では「遅い」という意味は、ユーザーの使い方を調べてみないと分かりません。

遅い理由としては、

  1. 実際にCPUが100%負荷
  2. メモリ空き容量がない
  3. HDDへのアクセス待ち(仮想記憶、データへのアクセス)
  4. 必要なデータ待ち(ネットワークの向こう側からデータが届くのを待っている)

などが考えられます。

この中で、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形式で保存するようにしたり、タイムスタンプを入れたり、まだまだ工夫が必要になりますね。

コメントを残す