Чи добре запускати perfmon на виробничих серверах? І чому?


28

Або perfmon має бути обмежений сервером Dev / QA тестами навантаження, що імітують виробничу діяльність?

Я хотів би запустити парфмон протягом двох днів ( як, наприклад, пропонує майстер сервера Sql Брент Озар ), щоб отримати загальне враження щодо роботи бази даних мого веб-додатка.


1
Деякі люди пропонують використовувати SQL Trace - будьте обережні зі слідом SQL і ніколи не відстежуйте всю активність на сервері prod.
Сем

Відповіді:


26

SQL Server та більшість інших продуктів генерують лічильники постійно, незалежно від того, є слухачі чи ні (ігноруючи параметр запуску -x). Контрольне відстеження є повністю прозорим для програми, що контролюється. Існує область спільної пам’яті, в яку записується додаток, що контролюється, і з якої сеанси моніторингу читають необроблені значення через зазначений інтервал. Отже, єдиною вартістю, пов'язаною з моніторингом, є вартість процесу моніторингу та вартість запису відібраних значень на диск. Вибір пристойного інтервалу збору (я зазвичай вибираю 15 сек) та помірної кількості лічильників (50-100), а також запису у бінарний формат файлів, як правило, не залишає ніякого впливу на систему, що контролюється.

Але я б рекомендував не використовувати Perfmon (як у perfmon.exe). Замість того, щоб ознайомитись з logman.exe, див. Опис Logman.exe, Relog.exe та Typeperf.exe Інструменти . Таким чином ви не прив’язуєте сеанс колекціонування до свого сеансу. Logman, будучи інструментом командного рядка, може використовуватися в сценаріях і запланованих завданнях для запуску і зупинки сеансів збору.


Я використовую TypePerf.exe з DSN для вставки даних безпосередньо в таблиці. Для них є окремий db. Чи вплине це якимось чином?
UdIt Solanki

14

Немає нічого поганого в запуску парфмонів на виробничих коробках. Це порівняно низький ключ, і може зібрати для вас багато корисної інформації. І як би ви точно моделювали виробничі навантаження, якби не виконали аналіз на виробничому сервері? Від Брента Озара у власному посиланні:

Нехай Perfmon працює протягом дня або двох, щоб зібрати хорошу базову лінію активності сервера. Це не так інвазивно на моніторингу SQL Server, і поглиблені результати окупляться. Чим більше даних у нас, тим кращу роботу ми можемо проаналізувати результати Perfmon.

Я проводив парфмони на багатьох виробничих коробках без шкідливих наслідків.


5
Погоджено - немає витрат на роботу Perfmon. Ще одна відповідь запропонувала запустити Profiler замість Perfmon, але для запуску Profiler є дуже реальні витрати. Я бачив, як сліди Profiler знімають виробничі сервери, коли вікно відстеження не може йти в ногу з навантаженням або коли додане навантаження штовхнуло сервер виробництва через край.
Брент Озар

Дякуємо за звучання в @Brent. До речі, я вчора купив твою книгу інтернатів 2008 року .
Білл Паетке

Ах, круто! Дайте мені знати, що ви думаєте про це.
Брент Озар

7

З тих пір, коли я слухав Клінта Хаффмана , який написав PAL утиліту для аналізу журналів Perfmon, у підкасті один раз. Я налаштував те, що я називаю рекордером польоту на всіх наших серверах виробничих додатків. Ця практика дуже корисна для діагностики проблем та моніторингу тенденцій.

Нижче наведено сценарій, який я використовую для налаштування автозапуску колектора Perfmon, з очищенням журналу. За бажанням його можна подати у файл з переліком лічильників продуктивності для збору (по одному на рядок) або з XML-файлом порогу PAL. Мені подобається використовувати файли порогу PAL.

<#
Install-FlightRecorder.ps1
.SYNOPSIS
Installs or sets up the pieces necessary to create PerfMon Collector 
snapshots, one a minute, to a file located in C:\FlightRecorder.

.DESCRIPTION
Installs or sets up the pieces necessary to create PerfMon Collector 
snapshots, one a minute, to a file located in C:\FlightRecorder.

.PARAMETER Path
File listing performance counters to collect, one per line. 
Or a PAL Threshold XML file.

#>
[CmdletBinding()]
param (
    [string]$Path
)

#Requires -RunAsAdministrator
$ScriptDir = { Split-Path $MyInvocation.ScriptName –Parent }
$DeleteTempFile = $False

function Main {
    if (-not $Path) { $Path = DefaultFile $Path }
    if (-not (Test-Path $Path)) {
        Write-Warning "Path does not exist or is inaccessable: $Path"
        Exit 1
    }
    if ($Path -like '*.xml') { $Path = PALFile $Path }

    Install-FlightRecorder
    if ($Path.startswith($env:TEMP)) {Remove-Item $Path}
    Write-Verbose 'Installation Successful.'
}

function Install-FlightRecorder {
    Write-Verbose 'Setting up the Flight Recorder.'
    if (-not (Test-Path c:\FlightRecorder\)) {
        mkdir c:\FlightRecorder | out-null 
    }
    if ((LOGMAN query) -match 'FlightRecorder') {
        Write-Verbose 'Removing former FlightRecorder PerfMon Collector.'
        LOGMAN stop FlightRecorder | out-null
        LOGMAN delete FlightRecorder | Write-Verbose
    }
    Write-Verbose 'Creating FlightRecorder PerfMon Collector.'
    LOGMAN create counter FlightRecorder -o "C:\FlightRecorder\FlightRecorder_$env:computername" -cf $Path -v mmddhhmm -si 00:01:00 -f bin | Write-Verbose
    SCHTASKS /Create /TN FlightRecorder-Nightly /F /SC DAILY /ST 00:00 /RU SYSTEM /TR 'powershell.exe -command LOGMAN stop FlightRecorder; LOGMAN start FlightRecorder; dir c:\FlightRecorder\*.blg |?{ $_.LastWriteTime -lt (Get-Date).AddDays(-3)} | del' | Write-Verbose
    SCHTASKS /Create /TN FlightRecorder-Startup /F /SC ONSTART /RU SYSTEM /TR "LOGMAN start FlightRecorder" | Write-Verbose
    SCHTASKS /Run /TN FlightRecorder-Startup | Write-Verbose
}

function DefaultFile {
    Write-Warning 'Counter or PAL file not specified, using default configuration.'
    $DeleteTempFile = $True
    $Path = [System.IO.Path]::GetTempFileName()
    Set-Content -Encoding ASCII $Path @'
\LogicalDisk(*)\Avg. Disk sec/Read
\LogicalDisk(*)\Avg. Disk sec/Write
\LogicalDisk(*)\Disk Transfers/sec
\LogicalDisk(C:)\Free Megabytes
\Memory\% Committed Bytes In Use
\Memory\Available MBytes
\Memory\Committed Bytes
\Memory\Free System Page Table Entries
\Memory\Pages Input/sec
\Memory\Pages/sec
\Memory\Pool Nonpaged Bytes
\Memory\Pool Paged Bytes
\Memory\System Cache Resident Bytes
\Network Interface(*)\Bytes Total/sec
\Network Interface(*)\Output Queue Length
\Paging File(*)\% Usage
\Paging File(*)\% Usage Peak
\PhysicalDisk(*)\Avg. Disk sec/Read
\PhysicalDisk(*)\Avg. Disk sec/Write
\Process(_Total)\Handle Count
\Process(_Total)\Private Bytes
\Process(_Total)\Thread Count
\Process(_Total)\Working Set
\Processor(*)\% Interrupt Time
\Processor(*)\% Privileged Time
\Processor(*)\% Processor Time
\System\Context Switches/sec
\System\Processor Queue Length
'@
    $Path
}

function PalFile {
    $DeleteTempFile = $True
    $InputPath = $Path
    $Path = [System.IO.Path]::GetTempFileName()
    $filesRead = @()
    Read-PalFile $InputPath | Select -Unique | sort | Set-Content -Encoding ASCII $Path
    $Path
}

$script:filesRead =@()
function Read-PalFile ([string]$path) {
    if (-not (Test-Path $path)) {
        Write-Warning "PAL Threshold file not found: $path"
        return
    }
    if ($script:filesRead -contains $path) {return}
    $script:filesRead += @($path)
    Write-Verbose "Reading PAL Threshold file: $path"
    $xml = [XML](Get-Content $path)
    $xml.SelectNodes('//DATASOURCE[@TYPE="CounterLog"]') | select -expand EXPRESSIONPATH
    $xml.SelectNodes('//INHERITANCE/@FILEPATH') | select -expand '#text' | where {$_ } | ForEach {
        $newpath = Join-Path (Split-Path -parent $path) $_
        Write-Debug "Inheritance file: $newpath"
        Read-PalFile $newpath
    }
}

. Main

Чи потрібен цей скрипт для встановлення (PAL або щось інше)? Чи можете ви надати зразок вихідного файлу, який він створює, якщо це можливо? Вибачте, я не знаю PowerShell.
CodingYoshi

Немає чого встановлювати. Цей сценарій конфігурує вбудовані функції Windows. Він створює колектор PerMon, плюс два заплановані завдання. Одне завдання, запускає колектор PerfMon після перезавантаження. Інше завдання - очищення старих файлів журналів. Якщо ви хочете проаналізувати свої файли PerfMon за допомогою PAL, я рекомендую встановити PAL і запустити його на невиробничий сервер. Для легкої настройки це буде прочитати файл конфігурації PAL.
Натан Хартлі

3

Ми робимо це досить часто. Це також важливо для встановлення базової лінії в реальному середовищі, тому ви можете порівняти пізніше, якщо є проблеми або вам потрібно провести дослідження потенціалу.

Я рекомендую не ходити нижче 10-секундного інтервалу. Якщо ви збираєте багато об'єктів / лічильників, а інтервал занадто частий, це може вплинути на операції.

Microsoft має майстра PerfMon, який налаштує завдання для вас.

http://www.microsoft.com/downloads/details.aspx?FamilyID=31FCCD98-C3A1-4644-9622-FAA046D69214&displaylang=en


Я бачу, що майстер PerfMon був випущений у 2004 році. Цікаво, чи він стандартний для SQL Server 2005.
Білл Паетке

Я думаю, що версія все ще є актуальною.
Грег Аскеу

2

В ідеальному світі, де виробничий сервер точно відображає те, що робить сервер розробників, а також є точним дублікатом сервера dev, perfmon ніколи не потрібно вимагати на виробничому сервері, оскільки результати будуть такими ж, як і на сервері розробників. Звичайно, що міфічної ситуації ніколи не буває, тому нам потрібно запускати парфмони на виробничих серверах, і в цьому немає нічого поганого. Крім усього іншого, нам може знадобитися використовувати perfmon та інші інструменти, щоб дізнатися, чому виробничий сервер веде себе не так, як сервер розробників.


2

Чому парфмон? Я маю на увазі, що в останніх версіях SQL-сервера є свій власний метод зробити це, включаючи побудову (центрального) сховища даних лічильників продуктивності, про які потім можна запитувати і звітувати проти. Тут немає нуля сенсу в запуску парфмонів.

Я, як завжди, здивований усіма публікаціями тут людей, які, очевидно, ніколи не читають документацію;)

http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/ - це хороший початок. IMHO, який повинен працювати майже на кожному сервері sql, який використовується для виробничих цілей.


1

Нічого поганого в запуску Perfmon, як багато хто запропонував, але я б запустив Profiler замість цього або додатково, з тими ж застереженнями, не захоплюйте занадто часто, просто фіксуйте тривалі запити, тобто тривалість> x секунд, або процесор> xx або читає> xxxx; дуже мало впливу, і ви швидко побачите запити, які отримали б найбільшу користь від налаштування.


що ви використовуєте в якості базових порогових значень тривалості, процесора та читання?
Білл Паетке

Це залежить від програми, але я б почав з тривалості> (максимальний час, я хотів би, щоб будь-який користувач чекав на що-небудь); почніть занадто високо, 10 секунд або більше, якщо нічого не вийде, чудово, трохи відмовіться. Гарантуємо, що вас чекає кілька сюрпризів, "пливуть" до вершини.
SqlACID

..і я би почав з тривалості, використовуйте процесор лише у тому випадку, якщо ви вважаєте, що ви пов'язані з процесором, читайте чи записуйте лічильники, якщо ви пов'язані з входом / виводом, але використовуйте тривалість, якщо ви не впевнені, де лежать вузькі місця, або просто , як ви сказали, намагаючись відчути те, що відбувається.
SqlACID
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.