08.08.2022
logo

Logman + Schtasks + Powershell собираем логи производительности

В данной статье будет рассмотрен один из способов организации сбора метрик производительности на удаленных серверах. Для этого мы будем использовать штатные средства такие как 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 здесь.

Игорь Чердаков

Мне 32 года. За моими плечами 8 лет опыта работы в IT, 4 из которых в администрировании. Сопровождая немалую инфраструктуру, в ежедневной деятельности я сталкиваюсь с необходимостью автоматизации рутинных процессов, в чем мне успешно помогает Powershell. Данный блог основывается на моем личном опыте и знаниях. Мои статьи не являются истиной в последней инстанции и я положительно отношусь к обоснованной и конструктивной критике. По этому я приглашаю Вас обсуждать волнующие нас вопросы, связанные с Powershell.

Посмотреть все записи автора Игорь Чердаков →

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *