Вы здесь

Скрипт PowerShell для сбора статистики потребления памяти и процессора по процессам


Скрипт PowerShell для сбора статистики потребления памяти и процессора по процессам

Сегодня хочу показать вам скриптик, который поможет с мониторингом потребления ресурсов. Он собирает статистику потребления памяти и процессора каждым процессом, при этом для значений по процессору высчитываются средние значения потребления за 10 секунд (с шагом измерения в секунду). Результаты выполнения сохраняются в файлы CSV, которые потом уже можно будет проанализировать, постоить графики и т.п.

Скрипты загрузил ]]>на github]]>. Если в них что-то поменяется, то с большей долей вероятности эти изменения будут именно там.

Там загружено несколько скриптов, предлагаю взглянуть на них

Runscript.ps1

$path="C:\Users\user\Documents\git\ps-perfmon"
$csvPath="\\server\statistics\"
$servers=get-content "$path\servers.txt"
foreach ($server in $servers){
    $filenamemem=$csvPath+$server+"-mem.csv"
    $resultmem=$null
    $contentmem=$null
    $contentmem=import-csv $filenamemem
    $resultmem=invoke-command -computername $server -filepath "$path\perfmonmem.ps1"
    if ($resultmem -ne $null){
        $contentmem += $resultmem
        $contentmem | export-csv $filenamemem
    }
    $filenamecpu=$csvPath+$server+"-cpu.csv"
    $resultcpu=$null
    $contentcpu=$null
    $contentcpu=import-csv $filenamecpu
    $resultcpu=invoke-command -computername $server -filepath "$path\perfmoncpu.ps1"
    if ($resultcpu -ne $null){
        $contentcpu += $resultcpu
        $contentcpu | export-csv $filenamecpu
    }
}

 

Этот скрипт нужен для удаленного запуска сбора статистики с нужных серверов, которые задаются в файле servers.txt простым списком.

В нём обязательно нужно указать ваши переменные $path и $csvPath. Первая – это путь до папки со скриптами, вторая – путь куда нужно сохранять получаемые файлы CSV.

Perfmoncpu.ps1

$path="C:\Users\user\Documents\git\ps-perfmon"
$csvPath="\\server\statistics\"
$servers=get-content "$path\servers.txt"
foreach ($server in $servers){
    $filenamemem=$csvPath+$server+"-mem.csv"
    $resultmem=$null
    $contentmem=$null
    $contentmem=import-csv $filenamemem
    $resultmem=invoke-command -computername $server -filepath "$path\perfmonmem.ps1"
    if ($resultmem -ne $null){
        $contentmem += $resultmem
        $contentmem | export-csv $filenamemem
    }
    $filenamecpu=$csvPath+$server+"-cpu.csv"
    $resultcpu=$null
    $contentcpu=$null
    $contentcpu=import-csv $filenamecpu
    $resultcpu=invoke-command -computername $server -filepath "$path\perfmoncpu.ps1"
    if ($resultcpu -ne $null){
        $contentcpu += $resultcpu
        $contentcpu | export-csv $filenamecpu
    }
}

 

Тут всё просто – это собственно сбор статистики по процессору.

Тут стоит обратить внимание на $cores – в старых версиях powershell, например на Windows 2008 эта переменная не сможет быть получена и её нужно задать в ручную, что собственно и делается ниже. При необходимости можно будет добавить несколько аналогичных условий, если у вас число ядер окажется разным. Нужна она для корректного подсчёта процентного потребления процессора – дело в том, что perfmon отдаёт значения по всем ядрам сразу, и это значение может с лёкостью оказаться больше 100, и внешне всё будет выглядеть как ошибочные значения.

Также при необходимости вы можете увеличить или уменьшить количество замеров, для расчёта средних значений изменив параметры -SampleInterval 1 -MaxSamples 10 в get-counter. 1ый – это время в секундах – с какой периодичность брать значения, второй количество замеров. Это нужно, т.к. моментальная нагрузка на процессор может плавать в довольно больших диапазонах, и что бы хоть как то приблизиться к показателям, например из диспетчера задач – нужно брать значения за промежуток времени.

Perfmonmem.ps1

$date=get-date -format "dd-MM-yyyy HH-mm"
$properties=@(
    @{Name="Date"; Expression = {$date}},
    @{Name="Process Name"; Expression = {$_.name}},  
    @{Name="Memory(MB)"; Expression = {[Math]::Round(($_.workingSetPrivate / 1mb),2)}}
)
$result=Get-WmiObject -class Win32_PerfFormattedData_PerfProc_Process | Select-Object $properties |Sort-Object -property "Memory (MB)" -Descending
$result

 

Тоже, что и с процессором, но для памяти. Тут среднее не считается, берутся только текущие значения.

Perfmon-single.ps1

$date=get-date -format "dd-MM-yyyy HH-mm"
$path="C:\Users\user\Documents\git\ps-perfmon"
$csvPath="\\server\statistics\"
$memfilename=$csvPath+$env:COMPUTERNAME+"-mem.csv"
$cpufilename=$csvPath+$env:COMPUTERNAME+"-cpu.csv"
$properties=@(
    @{n="date";e={$date}},
    @{Name="PName"; Expression = {$_.name}},
    @{Name="Memory(MB)"; Expression = {[Math]::Round(($_.workingSetPrivate / 1mb),2)}}
)
$cores=(Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors
$mem=$null
$cpu=$null
$mem=Get-WmiObject -class Win32_PerfFormattedData_PerfProc_Process | Select-Object $properties |Sort-Object -property "Memory (MB)" -Descending
$cpu=get-counter "\Process(*)\% Processor Time" -erroraction silentlycontinue -SampleInterval 1 -MaxSamples 10 | Select-Object -ExpandProperty CounterSamples | Group-Object -Property InstanceName | ForEach-Object { $_ | Select-Object -Property @{n="date";e={$date}},Name, @{n='CPU (AVG 10s)';e={[math]::Round((($_.Group.CookedValue | Measure-Object -Average).Average/$cores),2)}}}
$contentmem=$null
$contentmem=import-csv $memfilename
    if ($mem -ne $null){
        $contentmem += $mem
        $contentmem | export-csv $memfilename
    }
$contentcpu=$null    
$contentcpu=import-csv $cpufilename
    if ($cpu -ne $null){
        $contentcpu += $cpu
        $contentcpu | export-csv $cpufilename
    }

 

По факту – это объединение предыдущих скриптов в один, для запуска его локально, например, если у вас по какой-то причине не будет доступа к удалённому управлению через PowerShell каким-нибудь сервером.

1 0

Поделитесь статьей с друзьями в соц. сетях, возможно, она будет им полезна.


Если вам помогла статья, вы можете >>отблагодарить автора<<