PowerShellでOSリソース情報(CPU、Memory、Disk)を取得する

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