Frage Ist es in Ordnung, Perfmon auf Produktionsservern auszuführen? Und warum?


Oder sollte perfmon auf einen Dev / QA-Server mit Lasttests beschränkt sein, die Produktionsaktivitäten simulieren?

Ich würde gerne Perfmon zwei Tage lang (wie Sql Server Master Brent Ozar vorschlägt), um ein Gesamtbild der Datenbankleistung meiner Webanwendung zu erhalten.


27
2018-05-11 20:53


Ursprung


Einige Leute haben vorgeschlagen, eine SQL-Ablaufverfolgung zu verwenden - seien Sie vorsichtig mit der SQL-Ablaufverfolgung und verfolgen Sie niemals alle Aktivitäten auf einem Produktserver. - Sam


Antworten:


SQL Server und die meisten anderen Produkte generieren die Zähler die ganze Zeit, unabhängig davon, ob Listener vorhanden sind oder nicht (die Startoption -x wird ignoriert). Die Ablaufverfolgung von Zählern ist für die überwachte Anwendung vollständig transparent. Es gibt einen gemeinsamen Speicherbereich, in den die überwachte Anwendung schreibt und von dem die Überwachungssitzungen die Rohwerte im angegebenen Intervall lesen. Die einzigen Kosten, die mit der Überwachung verbunden sind, sind die Kosten des Überwachungsprozesses und die Kosten für das Schreiben der Abtastwerte auf die Platte. Die Wahl eines anständigen Erfassungsintervalls (ich wähle normalerweise 15 Sekunden) und eine moderate Anzahl von Zählern (50-100), und das Schreiben in ein binäres Dateiformat hat normalerweise keine Auswirkungen auf das überwachte System.

Aber ich würde empfehlen, Perfmon (wie in perfmon.exe) zu verwenden. Stattdessen sollten Sie sich mit logman.exe vertraut machen, siehe Beschreibung der Tools Logman.exe, Relog.exe und Typeperf.exe. Auf diese Weise verknüpfen Sie die Sammlungssitzung nicht mit Ihrer Sitzung. Logman, ein Befehlszeilentool, kann in Skripten und geplanten Jobs zum Starten und Stoppen von Sammlungssitzungen verwendet werden.


26
2018-05-12 06:50



Ich verwende TypePerf.exe mit DSN, um Daten direkt in Tabellen einzufügen. Es gibt eine separate db für sie. Wird es in irgendeiner Weise beeinflussen? - UdIt Solanki


Es ist nichts falsch daran, Perfmon auf Produktionskästen zu laufen. Es ist relativ low key und kann viele gute Informationen für Sie sammeln. Und wie würden Sie Produktionslasten genau simulieren, wenn Sie keine Analyse auf dem Produktionsserver durchgeführt hätten? Von Brent Ozar in Ihrem eigenen Link:

Lassen Sie Perfmon für einen oder zwei Tage laufen   Sammeln Sie eine gute Grundlinie des Servers   Aktivität. Es ist nicht so invasiv   der überwachte SQL Server und   Die tiefgreifenden Ergebnisse werden sich auszahlen. Das   mehr Daten haben wir, desto besser sind wir   kann das Perfmon analysieren   Ergebnisse.

Ich habe Perfmon in einer Reihe von Produktions-Exchange-Boxen ohne negative Auswirkungen ausgeführt.


14
2018-05-11 21:01



Perfekt. Danke, @Holocryptic. - Bill Paetzke
Einverstanden - es gibt keinen Overhead beim Ausführen von Perfmon. Eine andere Antwort schlug vor, Profiler anstelle von Perfmon auszuführen, aber es gibt einen sehr realen Aufwand für das Ausführen von Profiler. Ich habe gesehen, dass Profiler-Traces Produktionsserver herunterfahren, wenn das Tracing-Feld nicht mit der Last Schritt halten konnte oder wenn die hinzugefügte Last den Produktionsserver über den Rand trieb. - Brent Ozar
Danke, dass du in @Brent geläutet hast. Übrigens, ich habe dein gekauft 2008 Internal Book gestern. - Bill Paetzke
Achso cool! Lass mich wissen, was du davon hältst. - Brent Ozar


Seit ich gehört habe Clint Huffman, Wer schrieb KUMPEL ein Dienstprogramm zur Analyse von Perfmon Logs, einmal in einem Podcast. Ich habe den Flight Recorder auf allen unseren Produktionsanwendungsservern eingerichtet. Diese Vorgehensweise ist sehr nützlich, um Probleme zu diagnostizieren und Trends zu überwachen.

Unten ist das Skript, das ich benutze, um einen automatisch startenden Perfmon Collector mit Protokollbereinigung einzurichten. Bei Bedarf kann eine Datei mit Leistungsindikatoren für die Erfassung (eine pro Zeile) oder eine PAL-Schwellenwert-XML-Datei eingegeben werden. Ich benutze gerne die PAL Threshold Dateien.

<#
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

6
2018-05-11 21:43



Muss dieses Skript installiert werden (PAL oder irgendetwas anderes)? Können Sie bitte ein Beispiel für die Ausgabedatei angeben, die es generiert, wenn möglich? Entschuldigung, ich kenne PowerShell nicht. - CodingYoshi
Es gibt nichts zu installieren. Dieses Skript konfiguriert native Windows-Funktionen. Es erstellt einen PerMon-Kollektor und zwei geplante Aufgaben. Eine Task startet den PerfMon-Collector nach einem Neustart. Die andere Aufgabe, bereinigt alte Protokolldateien. Wenn Sie Ihre PerfMon-Dateien mit PAL analysieren möchten, würde ich empfehlen, PAL einzurichten und auf einem Nicht-Produktionsserver laufen zu lassen. Zur einfachen Einrichtung liest dies eine PAL-Konfigurationsdatei. - Nathan Hartley


Wir machen es ziemlich häufig. Es ist auch wichtig für die Erstellung einer Baseline in der realen Umgebung, so dass Sie später vergleichen können, wenn es Probleme gibt oder Sie eine Kapazitätsstudie durchführen müssen.

Ich empfehle jedoch nicht unter ein 10-Sekunden-Intervall zu gehen. Wenn Sie viele Objekte / Zähler sammeln und das Intervall zu häufig ist, kann dies Auswirkungen auf Vorgänge haben.

Microsoft verfügt über einen PerfMon-Assistenten, der die Aufgabe für Sie einrichten wird.

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


3
2018-05-11 21:15



Ich sehe, dass der PerfMon Wizard im Jahr 2004 veröffentlicht wurde. Ich frage mich, ob es standardmäßig mit SQL Server 2005 geliefert wird. - Bill Paetzke
Ich denke diese Version ist immer noch aktuell. - Greg Askew


In einer idealen Welt, in der ein Produktionsserver genau das widerspiegelt, was ein Dev-Server ist und auch ein exaktes Duplikat des Dev-Servers ist, sollte perfmon niemals auf dem Produktionsserver benötigt werden, da die Ergebnisse dieselben wie auf dem Dev-Server wären. Natürlich passiert diese mythische Situation nie, also müssen wir Perfmon auf Produktionsservern laufen lassen und es ist absolut nichts falsch daran. Unter anderem müssen wir möglicherweise mithilfe von perfmon und anderen Tools herausfinden, warum sich der Produktionsserver nicht wie der Dev-Server verhält.


2
2018-05-11 21:43





Warum Perfmon? Ich meine, neuere Versionen von SQL Server haben ihre eigene Methode, das zu tun, einschließlich des Aufbaus eines (zentralen) Data Warehouse von Leistungsindikatoren, die dann abgefragt und berichtet werden können. Es ist sinnlos, dort Perfmon zu laufen.

Ich bin, wie immer, erstaunt über alle Beiträge von Leuten, die offensichtlich nie die Dokumentation gelesen haben;)

http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/ ist ein guter Anfang. IMHO sollte das auf fast jedem SQL-Server funktionieren, der für Produktionszwecke verwendet wird.


2
2018-05-12 07:04





Nichts ist falsch mit dem Ausführen von Perfmon, wie viele vorgeschlagen haben, aber ich würde Profiler stattdessen oder zusätzlich ausführen, mit den gleichen Vorbehalten, nicht zu viel zu oft erfassen, nur lange laufende Abfragen erfassen, dh Dauer> x Sekunden oder cpu> xx oder liest> xxxx; sehr geringe Auswirkungen, und Sie werden schnell die Abfragen sehen, die am meisten vom Tuning profitieren würden.


1
2018-05-12 00:39



Was verwendest du als Basisschwellenwerte für Dauer, CPU und Lesevorgänge? - Bill Paetzke
Es hängt von der App ab, aber ich würde mit der Dauer beginnen> (maximale Zeit, die ich jeden Benutzer auf etwas warten lassen möchte); Beginne zu hoch, 10 Sekunden oder mehr, wenn du nichts bekommst, großartig, mach es ein wenig zurück. Garantiert, dass Sie einige Überraschungen haben werden, die nach oben "schweben". - SqlACID
..und ich würde mit der Dauer beginnen, verwende nur CPU, wenn du denkst, dass du CPU-gebunden bist, lese oder schreibe Zähler, wenn du I / O-gebunden bist, verwende aber Dauer, wenn du nicht sicher bist, wo die Engpässe liegen wie du gesagt hast, um ein Gefühl für das zu bekommen, was vor sich geht. - SqlACID