Сегодня хочу показать вам скриптик, который поможет с мониторингом потребления ресурсов. Он собирает статистику потребления памяти и процессора каждым процессом, при этом для значений по процессору высчитываются средние значения потребления за 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 каким-нибудь сервером.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Поделитесь статьей с друзьями в соц. сетях, возможно, она будет им полезна.
Если вам помогла статья, вы можете >>отблагодарить автора<<