Счетчики производительности Windows + PowerShell
#DevOps
#оптимизация
#производительность
#Windows
#счетчики
PowerShell
Работу со счетчиками производительности из PowerShell выполняется с помощью командыGet-Counter.
Например, получение всех доступных счетчиков производительности в системе.
Get-Counter -ListSet *
Или получение % использования ЦП с интервалом обновления в 2 секунды (SampleInterval) и максимальным количеством проверок (MaxSamples) равным 3.
Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 2 -MaxSamples 3
Или получение значения счетчика на текущий момент времени.
Get-Counter -Counter "\Процессор(_Total)\% загруженности процессора"
И так далее.
Локализация
Имена счетчиков производительности могут отличаться в зависимости от локализации в системе Windows. Например, если в англоязычной версии:
\Processor(_Total)\% Processor Time
То в русскоязычной версии:
\Процессор(_Total)\% загруженности процессора
Кроме этого можно обращаться к счетчикам по целочисленным идентификаторам независимо от локализации,как это делает Zabbix. Для счетчика выше это будет выглядеть так:
\240(_Total)\10
Для получения ID для частей имени счетчика можно воспользоваться таким способом.
$keyEnglish = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009'$keyLocalized = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\CurrentLanguage'$countersEnglish = (Get-ItemProperty -Path $keyEnglish -Name Counter).Counter$countersLocalized = (Get-ItemProperty -Path $keyLocalized -Name Counter).Counter$perfCountersEng = new-object "System.Collections.Generic.Dictionary[[int],[string]]"$countersEnglishCount = $countersEnglish.Count / 2for($num = 1; $num -le $countersEnglishCount; $num++){$indexId = $num * 2$indexName = $indexId - 1$counterId = $countersEnglish[$indexId]$counterName = $countersEnglish[$indexName]if($perfCountersEng.ContainsKey($counterId)){# Ничего не делаем} else{$perfCountersEng.Add($counterId, $counterName) | Out-Null}}$perfCountersLocalized = new-object "System.Collections.Generic.Dictionary[[int],[string]]"$countersLocalizedCount = $countersLocalized.Count / 2for($num = 1; $num -le $countersLocalizedCount; $num++){$indexId = $num * 2$indexName = $indexId - 1$counterId = $countersLocalized[$indexId]$counterName = $countersLocalized[$indexName]if($perfCountersLocalized.ContainsKey($counterId)){# Ничего не делаем} else{$perfCountersLocalized.Add($counterId, $counterName) | Out-Null}}$allPerfCounter = new-object "System.Collections.Generic.Dictionary[[int],[object]]"foreach ($key in $perfCountersLocalized.Keys) {$allPerfCounter.Add($key,[pscustomobject]@{NameRus=$perfCountersLocalized[$key];NameEng=""})}foreach ($key in $perfCountersEng.Keys) {if($allPerfCounter.ContainsKey($key)){$allPerfCounter[$key].NameEng = $perfCountersEng[$key]} else{$allPerfCounter.Add($key,[pscustomobject]@{NameLocalized= "";NameEng=$perfCountersEng[$key]})}}$allPerfCounter
В результате получить объекты с информацией:
- ID - числовой идентификатор части имени счетчика
- NameLocalized - имя с учетом локализации
- NameEng - имя на английском без учета локализации
Можно для удобства все это выгрузить в CSV:
$csvData = New-Object Collections.Generic.List[object]foreach ($key in $allPerfCounter.Keys) {$objectInfo = [pscustomobject]@{Id=$keyNameLocalized= $allPerfCounter[$key].NameLocalizedNameEng=$allPerfCounter[$key].NameEng}$csvData.Add($objectInfo)}$csvData | Export-Csv -Path "C:Tempperfomance-counters.csv" -Delimiter ';'
Полезные ссылки
- PowerShellTools- репозиторий с полезными скриптами, материалами по PowerShell.
- Счетчики производительности Windows- в документации по Zabbix.
- PowerShell: the issues you bump into when using Get-Counter and Measure-Object aggregation
ОЧЕНЬ БОЛЬШОЙ пример таблицы имен счетчиков
Пример счетчиков производительности