Share:

Счетчики производительности Windows + PowerShell

YPermitinвDevOps

2022-06-18

#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 / 2
for($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 / 2
for($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=$key
NameLocalized= $allPerfCounter[$key].NameLocalized
NameEng=$allPerfCounter[$key].NameEng
}
$csvData.Add($objectInfo)
}
$csvData | Export-Csv -Path "C:Tempperfomance-counters.csv" -Delimiter ';'

Полезные ссылки

ОЧЕНЬ БОЛЬШОЙ пример таблицы имен счетчиков

Пример счетчиков производительности

Y

YPermitin

.NET, TSQL, DevOps, 1C:Enterprise

Developer, just developer.

Поделиться

Другие статьи

Расширение для SQL Server. Быстро и просто. SQLCLR снова в деле
Расширение для SQL Server. Быстро и просто. SQLCLR снова в деле
Решение проблем с модулями VMware в Ubuntu 22.04
Решение проблем с модулями VMware в Ubuntu 22.04
Берем процессы под контроль в .NET
Берем процессы под контроль в .NET

Все статьи от автора: YPermitin

Copyright © 2024 Убежище инженера