1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

PowerShellでパフォーマンスカウンターのバイナリファイル(.blg)の記録を読み込んで計算結果をまとめる

2022-01-04 22:29:15

モニタリングやレポーティングのために、データベースサーバーの稼働状況を確認するために、パフォーマンスカウンターの値を毎日カウントする必要があります。カウンターを開いて記入するのは面倒なので、今はpowershellを使ってカウンターから統計情報を読み取っています。

フェーズ1:Powershellがカウンタファイルを読み込み、カウンタの1つの値をカウントする

$startDate = (Get-Date).AddDays(-1).Date 
$endDate = (Get-Date).Date 
$perfPath = "D:\DataFiles\PERFMON\MSSQL_PERFMON_08240904.blg" 
 
# Read the names of the counters in the file 
$counterList = Import-Counter -Path $perfPath 
$countersNameList = $counterList[0].countersamples | % {$_.path} 
 
# Filter to specify counters and time to re-import into PS 
$counter = $countersNameList -like '*Processor Time*' 
$counterData = Import-Counter -Path $perfPath -Counter $counter | Where-Object -FilterScript {($_.Timestamp -ge $startDate) -and ($_.Timestamp - lt $endDate)}  
 
#Count the statistics of the values in the date range 
$counterInfo = $counterData | Foreach-Object {$_.CounterSamples} | Measure-Object -property CookedValue -Average -Maximum 
 
#Hash table to store result data 
$resultTable=@{} 
$resultTable."CPU Utilization -Average" = $counterInfo.Average 
$resultTable."CPU utilization - maximum" = $counterInfo.Maximum 
 
$resultTable 

フェーズ2:ファイル内の全カウンターを一括してカウントし、ファイルに書き出す

$startDate = (Get-Date).AddDays(-1).Date  
$endDate = (Get-Date).Date  
$perfPath = "D:\360Downloads\*.blg" 
 
#Hash table to store result data  
$resultTable = @{} 
 
#Import all counter information for the specified time 
$counterData = Import-Counter -Path $perfPath | Where-Object -FilterScript {($_.Timestamp -ge $startDate) -and ($_.Timestamp -lt $endDate)} 
 
# All counter names 
$countersNameList = $counterData[0].countersamples | % {$_.Path} 
 
# Iterate over each counter and store the computed results in a hash table 
foreach($counterName in $countersNameList)  
{  
#$counterName = "\\hzc\system\threads" 
$counterDataOne = $counterData | Foreach-Object {$_.CounterSamples} | Where {$_.Path -like $counterName}  
$counterInfo = $counterDataOne | Measure-Object CookedValue -Average -Minimum -Maximum 
$resultTable.$($counterName+" : Average") = $counterInfo.Average 
$resultTable.$($counterName+" : Minimum") = $counterInfo.Minimum 
$resultTable.$($counterName+" : Maximum") = $counterInfo.Maximum 
} 
 
#$resultTable.GetEnumerator() | sort Name | Format-Table -Auto 
# Several ways to export to file 
$resultTable.GetEnumerator() | sort Name | Format-Table -Auto | Out-File "D:\360Downloads\PerfmonCounter.txt" 
$resultTable.GetEnumerator() | sort Name | Export-Csv -Path "D:\360Downloads\PerfmonCounter.txt" -Encoding "unicode" - Force 
$resultTable.GetEnumerator() | sort Name | Format-List | Export-Csv -Path "D:\360Downloads\PerfmonCounter.xlsx" -Encoding " unicode" -Force