В данной статье будет рассмотрен один из способов организации сбора метрик производительности на удаленных серверах. Для этого мы будем использовать штатные средства такие как Performance Monitor (logman), Task Scheduler (schtasks) и Powershell.
Иногда возникают ситуации, когда при настроенном мониторинге сервер зависает и перестает отдавать метрики на сервер мониторинга. Чаще всего такое случается с аппаратными серверами. А зависание на столько тяжелое, что сервер игнорирует любые средства удаленного управления. Будь то RDP, IPMI, PSEXEC, remote powershell и т.д. И единственный способ вернуть его к жизни – дернуть сервер по питанию через IPMI. А после его загрузки Вы с удивлением обнаруживаете, что сервер перестал писать системные логи еще за долго до перезагрузки. В результате Вы не имеете ни значений счетчиков производительности на сервере мониторинга, ни логов. А причина зависания остается тайной, покрытой мраком.
В таком случае ничего не остается, как запустить сбор счетчиков непосредственно на самом сервере. И делать это мы будем удаленно и массово. Учитывая при этом вероятность переполнения диска C: файлами логов Performance Monitor‘а.
<# .Synopsis Author: Igor Cherdakov Email: IgorCherdakov@propowershell.ru Site: https://ProPowershell.ru .DESCRIPTION The script creates and starts remotely performance collector on target servers and saves logs after unplanned reboot of server. .EXAMPLE ./Collect-PerfLogs.ps1 -List '"server1","server2"' .EXAMPLE ./Collect-PerfLogs.ps1 -File "C:\servers.txt" .EXAMPLE ./Collect-PerfLogs.ps1 -List '"server1","server2"' -File "C:\servers.txt" .INPUTS Parameter -List: The parameter receives a list of servers defined one by one separated by commas Parameter -File: The parameter receives a path of file with server list .ROLE You need to have local administrator rights on the target server .FUNCTIONALITY The script creates and starts remotely performance collector on target servers. #> param ( [string]$List = "", [string]$File="" ) # Define function Start-Collector function Start-Collector { param ([string]$server = $null) if($server -ne $null) { if(Test-Connection -ComputerName $server) { Write-host "Starting of Performance Collector on $server" -ForegroundColor Green # Create a data collector on Performance Monitor logman create counter -s $server -cf Win_Performance -f bincirc -si 00:00:10 -cnf 00:30:00 -rc Clear_perflogs -c "\Processor()*" "\Memory*" "\LogicalDisk()*" "\Network Interface()*" "\PhysicalDisk()*" "\Process()*" "\System*" "\Cache*" "\Paging File()*" "\Processor Information(*)*" -name Win_Performance -v MMddHHmm -o PerfLogs\_Logs\log # Create scheduled tasks schtasks /CREATE /S $server /TN Start_perflogs /RU SYSTEM /SC ONSTART /TR "powershell -command if (!(Test-Path C:\PerfLogs_backup)) {mkdir C:\PerfLogs_backup} ; copy C:\PerfLogs_logs*.* C:\PerfLogs_backup\ ; logman start Win_Performance" schtasks /CREATE /S $server /TN Clear_perflogs /RU SYSTEM /SC ONSTART /TR "powershell -command if ((Get-ChildItem C:\PerfLogs_logs).count -gt 10) {Get-ChildItem C:\PerfLogs_logs\ | Sort LastWriteTime | Select -First 1 | Remove-Item -Force}" # Run Start_perflogs task schtasks /run /S $server /TN Start_perflogs Write-host "$server" -ForegroundColor Yellow # Add descriptions to scheduled tasks Invoke-Command -ComputerName $server -ScriptBlock { $desc = Get-ScheduledTask -TaskName Start_perflogs $desc.Description = "Don't delete!! The task runs performance data collector when server is starting." Set-ScheduledTask -InputObject $desc $desc = Get-ScheduledTask -TaskName Clear_perflogs $desc.Description = "Don't delete!! The task cleans old performance logs." Set-ScheduledTask -InputObject $desc } } else {Write-Host "The server name is incorrect or server is unreachable" -ForegroundColor Red} } else {Write-Host "Parameter -server is empty!" -ForegroundColor Red} } Set-Location C:\ if($List -eq "" -and $File -eq "") { Write-Host "Target servers not specified" -ForegroundColor Red } else { if($List -ne "") { $List -split ',' | foreach{ Start-Collector -server $_ } } if($File -ne "") { if(!(Test-Path $File)){Write-Host "List file doesn't exist!" -ForegroundColor Red} else {Get-Content $File | foreach{ Start-Collector -server $_ }} } }
Скачать скрипт – ЗАГРУЗИТЬ.
Скрипт имеет два входных параметра: -List и -File. В первый передается список серверов, перечисленных через запятую. Например: ‘”server1″,”server2″,”…”‘. В параметр -File передается путь к файлу со списком целевых серверов. Вы можете использовать их как вместе, так и по отдельности. Но если не указать ни один из них, то скрипт выдаст соответствующее уведомление.
Что делают logman и schtasks
На удаленном сервере скрипт создает сборщик в Performance Monitor с именем – Win_Performance. Сборщик в течение 30 минут собирает ряд метрик: logman create counter -s $server -cf Win_Performance -f bincirc -si 00:00:10 -cnf 00:30:00 -rc Clear_perflogs -c “\Processor()” “\Memory” “\LogicalDisk()” “\Network Interface()” “\PhysicalDisk()” “\Process()” “\System” “\Cache” “\Paging File()” “\Processor Information()*” -name Win_Performance -v MMddHHmm -o PerfLogs_Logs\log. Лог файлы складывает в папку C:\PerfLogs_Logs\log.
Создает два задания в планировщике: Start_perflogs и Clear_perflogs. Оба задания стартуют при запуске системы после перезагрузки или включения.

- Start_perflogs – создает папку для бэкапа логов – C:\PerfLogs_backup на случай нештатной перезагрузки сервера. И копирует в нее логи из C:\PerfLogs_logs. После чего запускает сборщик Win_Performance.
- Clear_perflogs – запускается каждые 30 минут при закрытии записи очередного журнала производительности. Задача оставляет в папке C:\PerfLogs_logs\ только 10 самых свежих журналов, удаляя при этом самый старый.
Таким образом обеспечивается защита от переполнения диска С:. Необходимо только убедиться в наличии достаточного свободного места для 20ти логов. 10 логов текущих и 10 логов в каталоге C:\PerfLogs_backup. Важно не удалять задачи Start_perflogs и Clear_perflogs из планировщика заданий. Для чего в описание для этих задач добавляются соответствующие уведомления.
Как видим, powershell здесь выполняет больше организационную и вспомогательную роль. Но в целом мы получаем неплохой инструмент запуска логирования метрик производительности.
Изучайте основы powershell здесь.