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

  • Михаил
  • 12 мин. на прочтение
  • 91
  • 12 Dec 2014
  • 12 Dec 2014

Один из стереотипов, с которыми я сталкиваюсь с завидной периодичностью, состоит в том что важность PowerShell в процессах автоматизации работы системного администратора мало кто может оценить, поэтому его считают не основным рабочим инструментом, а неким «прибабахом» созданным в отместку всесильному bash. Во времена первой версии еще как то можно было иронизировать, а сейчас, когда уже ps имеет четвертую версию, не пользоваться им непозволительная роскошь…

Примечание: Чаще всего, все работают «по-старинке» и не стараются взять то что лежит на поверхности. Из десятка админов  всего два-три человека пользуются полным арсеналом возможностей. Это печально…

Давайте сегодня посмотрим что нам может дать PowerShell для того что бы облегчить нудный процесс сбора счетчиков производительности.

Get—Counter

Смотрим что получается. Получается вывод сэмплов для сетевого интерфейса, процессора, памяти и физического диска.

Get—Counter —ListSet *

Через пару экранов жмем Ctrl+C и пишем более конкретное

Get—Counter —ListSet *disk

Лучше, но все еще неясно что дальше?

Get—Counter —ListSet *disk | Sort-Object CounterSetName | Select-Object CounterSetName

Теперь запрашиваем конкретный набор

Get—Counter —ListSet ‘ LogicalDisk’

и получаем список доступных для этого набора счетчиков.

Get—Counter —ListSet ‘PhysicalDisk’ | Select-Object -ExpandProperty Counter

Для полноты картинки вводим еще

Get—Counter —ListSet LogicalDisk | Select-Object -ExpandProperty PathsWithInstances

Что дальше?
 

Get—Counter —ListSet ‘PhysicalDisk’ | Select-Object -ExpandProperty Counter | Out-File C:\TEMP\Sample.txt

Полученный список счетчиков выгружается в файл «C:\TEMP\Sample.txt».  Что бы все это хозяйство заработало, нам понадобится создать CSV-файл

Get—Counter —ListSet ‘LogicalDisk’, ‘PhysicalDisk’ |
 ForEach-Object {
 $CounterCategory = $_
 $CounterCategory | Select-Object -ExpandProperty Counter |
 ForEach-Object {
 $CounterName = $_
 $CounterName | Where-Object {$CounterName -match ‘(sec/Transfer|Avg. Disk Queue Length)’} |
 Select-Object @{E={$CounterCategory.CounterSetName};N="CounterSetName"},
 @{E={$CounterCategory.Description};N="Description"},
 @{E={$CounterName};N="Counter"}
 }
 } | Export-csv C:\temp\BaselineCounters.csv -NoClobber -NoTypeInformation -Append

Файл сформирован, смотрим что получилось

$Counters = (Import-Csv C:\temp\BaselineCounters.csv).counter 
 Get—Counter —Counter $Counters

Для упрощения восприятия немного причесываем вывод

$Counters = (Import-Csv C:\temp\BaselineCounters.csv).counter
 Get—Counter —Counter $Counters |
 Select-Object -ExpandProperty countersamples |
 Select-Object @{E={$_.timestamp};N="Date"},
 @{E={$_.path};N="Counter"},
 InstanceName,
 @{E={$_.cookedvalue};N="Value"}

Что бы получить заданные счетчики сразу с нескольких хостов добавляем в код

$Computers = Get-Content c:\temp\Servers.txt
 # и модифицируем строку
 Get—Counter -ComputerName $Computers —Counter $Counters

Дальше, что называется «по вкусу», добавляем количество запросов

Get—Counter —Counter $Counters —SampleInterval 2 —MaxSamples 10

Выгружаем информацию в файл

$Counters = (Import-Csv C:\temp\BaselineCounters.csv).counter
 Get—Counter —Counter $Counters —SampleInterval 2 —MaxSamples 10 | Export—counter -Path C:\TEMP\data1.blg

Ну а дальше… За чашечкой кофе разбираем результаты.