PowerShellでCPUやメモリ、ディスク使用率などのOSリソースに対する情報を取得する方法を書きます。
パフォーマンス情報を取得する色々方法はありますが、パフォーマンス モニター (PerfMon) で取得しているシステムも多いと思います。今回はこれをPowerShellから取得しようと思います。
方法としてGet-Counterのコマンドレットを使う方法もありますが、今回はWMIを利用します。
https://technet.microsoft.com/ja-jp/magazine/ee872428.aspx
WMIの探し方
WMIを探す方法からです。
WMIをGuiで探したい場合は、WMI Explorerというツールがあります。
wmie.codeplex.com
もしPowerShellに慣れているならPowerShellで探すのが楽です。
例えばパフォーマンス取得で利用することが多い、Win32_PerfFormattedDataクラスに関連するWMIを探してみます。Get-WmiObject -Listを利用します。
PS > Get-WmiObject -List | Where-Object { $_.name -match 'Win32_PerfFormattedData' } | select Name Name ---- Win32_PerfFormattedData Win32_PerfFormattedData_AFDCounters_MicrosoftWinsockBSP Win32_PerfFormattedData_APPPOOLCountersProvider_APPPOOLWAS Win32_PerfFormattedData_ASPNET2050727_ASPNETAppsv2050727 Win32_PerfFormattedData_ASPNET2050727_ASPNETv2050727 Win32_PerfFormattedData_ASPNET4030319_ASPNETAppsv4030319 ...以下省略
手元の環境だと166個とたくさん出てきました。
今回はOSのパフォーマンスデータを取りたいので、もう少し絞ります。
PS> Get-WmiObject -List | Where-Object { $_.name -match 'Win32_PerfFormattedData_Perf[OS:Disk]' } | select Name Name ---- Win32_PerfFormattedData_PerfDisk_LogicalDisk Win32_PerfFormattedData_PerfDisk_PhysicalDisk Win32_PerfFormattedData_PerfOS_Cache Win32_PerfFormattedData_PerfOS_Memory Win32_PerfFormattedData_PerfOS_NUMANodeMemory Win32_PerfFormattedData_PerfOS_Objects Win32_PerfFormattedData_PerfOS_PagingFile Win32_PerfFormattedData_PerfOS_Processor Win32_PerfFormattedData_PerfOS_System
だいぶOSの情報取るのに使えそうなのが出てきました。
ここで出てきたWMIなども利用しながら今回は代表的な指標であるCPU、メモリ、ディスクの使用率についての取得方法を書きます。
CPU使用率情報の取得
CPUの情報はWin32_PerfFormattedData_PerfOS_Processorのクラスを利用します。中でもPercentProcessorTimeのプロパティに使用率が入っています。実際に実行してみます。
Get-WmiObject Win32_PerfFormattedData_PerfOS_Processor | Select Name,PercentProcessorTime
以下のように全体のCPU使用率(_Total)とコア毎の個別のCPU使用率が出ます。後はこれを使うだけです。
Name PercentProcessorTime ---- -------------------- _Total 2 0 0 1 6 2 0 3 0
ツール作成も簡単
PowerShellなのでツールも簡単に作成できます。例えばCPUのコア毎の使用率を一定時間毎に確認していく簡単なスクリプトです。
$Count = 10 $intervalMiliSec = 1000 1..$Count | %{ $cpuinfo = New-Object -TypeName PSCustomObject $cpu = Get-WmiObject Win32_PerfFormattedData_PerfOS_Processor | ?{$_.Name -match "^[0-9]+$"} foreach($c in $cpu) { $cpuinfo | Add-Member -MemberType NoteProperty -Name $c.Name -Value $c.PercentProcessorTime } $cpuinfo Start-Sleep -Milliseconds $intervalMiliSec }
手元のPCはCPUが4つなので結果はこんな感じです。
0 1 2 3 - - - - 0 0 6 6 19 12 25 12 0 0 0 0 12 0 6 0 6 12 6 12 0 19 12 6 0 0 6 0 0 0 6 0 0 0 0 0 6 6 6 12
メモリ使用率情報の取得
次はメモリです。WMIクラスのWin32_PerfFormattedData_PerfOS_Memory を使えばメモリの情報が取れます。例えば使用可能な物理メモリのKB表示は以下になります。
$memInfo = Get-WmiObject Win32_PerfFormattedData_PerfOS_Memory $memInfo.AvailableKBytes
ただ、良くあるメモリの使用量が95%以上なら云々という話には、やはりパーセンテージが出したいところです。その場合はWin32_OperatingSystemの方が適切のようです。
Get-WmiObject Win32_OperatingSystem | %{(($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)/$_.TotalVisibleMemorySize) * 100}
以下の二つのプロパティはほぼ同じようです。
- Win32_PerfFormattedData_PerfOS_Memory クラスのFreePhysicalMemoryプロパティ
- Win32_OperatingSystemクラスのAvailableKBytesプロパティ
ディスク使用率情報の取得
最後にDiskドライブ毎の使用率を出します。
PS>Get-WmiObject Win32_PerfFormattedData_PerfDisk_LogicalDisk | select Name,PercentFreeSpace Name PercentFreeSpace ---- ---------------- _Total 23 C: 17 E: 8 F: 67 HarddiskVolume2 55 M: 29
ただDiskに限っては単純にGet-PSDrive使った方が早いかもしれません。ProviderをFileSystemでフィルタすれば欲しい情報が一覧されます。こっちの方が忘れにくいのでいつでもすぐに打てます。
Get-PSDrive -PSProvider FileSystem