Üretim sunucularında perfmon çalıştırmak uygun mudur? Ve neden?


28

Yoksa perfmon, üretim aktivitesini simüle eden yük testlerine sahip bir Dev / QA sunucusuyla mı sınırlı olmalı?

Web uygulamamın veritabanı performansı hakkında genel bir fikir edinmek için iki gün boyunca perfmon çalıştırmak istiyorum ( Sql Server yöneticisi Brent Ozar'ın önerdiği gibi ).


1
Bazı insanlar bir SQL Trace kullanmayı önermişlerdir - SQL trace konusunda dikkatli olun ve asla prod server'daki tüm aktiviteleri takip etmeyin.
Sam

Yanıtlar:


26

SQL Server ve diğer birçok ürün, dinleyicilerin olup olmadığına bakılmaksızın, sayaçları her zaman oluşturur (-x başlangıç ​​seçeneğini yoksayarak). İzlenen uygulamada sayaç takibi tamamen şeffaftır. İzlenen uygulamanın yazdığı ve izleme oturumlarının belirli aralıklarla işlenmemiş değerleri okuduğu paylaşılan bir bellek bölgesi vardır. Dolayısıyla, izlemeyle ilgili tek maliyet, izlemenin maliyeti ve örneklenen değerlerin diske yazılması maliyetidir. İyi bir toplama aralığı (genellikle 15 saniye seçiyorum) ve orta derecede sayıcı (50-100) seçiyorum ve ikili bir dosya biçiminde yazmak genellikle izlenen sistem üzerinde hiçbir etki bırakmıyor.

Ancak Perfmon kullanmamaya karşı (perfmon.exe'deki gibi) tavsiye ederim. Bunun yerine logman.exe ile tanışın, bkz . Logman.exe, Relog.exe ve Typeperf.exe Araçları açıklaması . Bu şekilde toplama oturumunu oturumunuza bağlamazsınız. Komut satırı aracı olan Logman, toplama oturumlarını başlatmak ve durdurmak için komut dosyalarında ve zamanlanmış işlerde kullanılabilir.


Doğrudan tablolara veri eklemek için TypePerf.exe DSN ile kullanıyorum. Onlar için ayrı bir db var. Herhangi bir şekilde etkileyecek mi?
UdIt Solanki

14

Üretim kutularında perfmon çalıştırmanın yanlış bir tarafı yok. Göreceli olarak düşük anahtardır ve sizin için birçok iyi bilgi toplayabilir. Ve eğer üretim sunucusunda bazı analizler yapmamış olsaydınız, üretim yüklerini doğru şekilde nasıl simüle edersiniz? Brent Ozar'dan kendi bağlantınızdaki:

Sunucu faaliyetinin iyi bir temelini toplamak için Perfmon'un bir veya iki gün boyunca çalışmasına izin verin. İzlenen SQL Server'daki istilacı değil ve ayrıntılı sonuçlar karşılığını verir. Ne kadar çok veriye sahipsek, Perfmon sonuçlarını analiz etmek için o kadar iyi bir iş yapabiliriz.

Olumsuz bir etkisi olmayan bir dizi üretim Exchange kutusunda perfmon kullandım.


5
Anlaştık - Perfmon'u çalıştırmak için ek yük yok. Başka bir cevap, Perfmon yerine Profiler çalıştırılmasını önermiştir, ancak Profiler'ı çalıştırmak için çok büyük bir yük vardır. Profiler izlerinin, izleme kutusu yüke yetişemediğinde veya eklenen yük üretim sunucusunu kenardan ittiğinde üretim sunucularını aldığını gördüm.
Brent Ozar

@Brent'te yer aldığınız için teşekkür ederiz. Bu arada, dün 2008 iç kitabını aldım .
Bill Paetzke

Ah guzel! Bana ne düşündüğünü söyle.
Brent Ozar

7

Ben dinledim beri Clint Huffman yazdı PAL kez bir podcast üzerinde, Perfmon Günlükleri analiz etmek için bir yardımcı program. Tüm üretim uygulama sunucularımızda Uçuş Kaydedicisi dediğim şeyi ayarladım. Bu uygulama, sorunları teşhis etmek ve trendleri izlemek için çok kullanışlı olmuştur.

Aşağıda, otomatik temizlemeli bir Perfmon Collector ayarlamak için kullandığım komut dosyası ve günlük temizlemesi var. İstenirse, toplanacak performans sayaçlarını (her satırda bir tane) veya bir PAL Eşik XML dosyasını listeleyen bir dosya beslenebilir. PAL Threshold dosyalarını kullanmayı seviyorum.

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

Bu betiğin yüklenmesi gereken herhangi bir şey var mı (PAL veya başka bir şey)? Lütfen mümkünse oluşturduğu çıktı dosyasının bir örneğini sağlayabilir misiniz? Üzgünüm PowerShell'i tanımıyorum.
KodlamaYoshi

Yüklenecek bir şey yok. Bu komut dosyası, yerel Windows özelliklerini yapılandırır. Bir PerMon toplayıcısı ve ayrıca iki zamanlanmış görev oluşturur. Bir görev, yeniden başlatmanın ardından PerfMon toplayıcıyı başlatır. Diğer görev, eski günlük dosyalarını temizler. PerfMon dosyalarınızı PAL ile analiz etmek istiyorsanız, PAL'nin kurulmasını ve üretim dışı bir sunucuda çalıştırılmasını öneririm. Kolay kurulum için, bu bir PAL yapılandırma dosyasını okuyacaktır.
Nathan Hartley

3

Çok sık yapıyoruz. Aynı zamanda gerçek ortamda bir temel oluşturmak için de önemlidir, bu nedenle sorun varsa veya kapasite çalışması yapmanız gerektiğinde daha sonra karşılaştırabilirsiniz.

Yine de 10 saniyenin altına inmemenizi tavsiye ederim. Çok sayıda nesne / sayaç topluyorsanız ve aralık çok sıksa, işlemleri etkileyebilir.

Microsoft, görevi sizin için ayarlayabilecek bir PerfMon Sihirbazı'na sahiptir.

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


PerfMon Sihirbazı'nın 2004 yılında piyasaya sürüldüğünü görüyorum. SQL Server 2005 ile standart gelip gelmediğini merak ediyorum.
Bill Paetzke

Bence bu sürüm hala güncel.
Greg Askew

2

Bir üretim sunucusunun bir dev sunucunun ne yaptığını tam olarak yansıttığı ve aynı zamanda dev sunucunun tam bir kopyası olduğu ideal bir dünyada, üretim sunucusunda perfmon hiçbir zaman gerekmemelidir, çünkü sonuçlar dev sunucudakilerle aynı olacaktır. Elbette, bu efsanevi durum asla gerçekleşmez, bu yüzden üretim sunucularında perfmon çalıştırmamız gerekir ve bu konuda kesinlikle yanlış bir şey yoktur. Diğer şeylerin yanı sıra, üretim sunucusunun neden dev sunucu ile aynı şekilde davranmadığını öğrenmek için perfmon ve diğer araçları kullanmamız gerekebilir.


2

Neden perfmon? SQL Server'ın son sürümleri, daha sonra sorgulanabilecek ve raporlanabilecek bir performans sayaçlarının (merkezi) veri ambarının oluşturulması da dahil olmak üzere kendi yöntemlerine sahiptir. Oradaki perfmonları çalıştırmanın hiç bir anlamı yok.

Ben, her zaman olduğu gibi, buradaki tüm gönderilerden şaşkınlık duyuyorum.

http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/ iyi bir başlangıçtır. Üretim amacıyla kullanılan hemen hemen her sql sunucusunda çalışması gereken IMHO.


1

Perfmon'u çalıştırmanın birçoğunun önerdiği gibi yanlış bir şey yok, ancak Profiler'ı bunun yerine ya da ek olarak çalıştıracağım, aynı uyarılarla çok sık yakalamıyorum, sadece uzun süren sorguları yakaladım, yani süre> x saniye veya cpu> xx , veya okur> xxxx; çok az bir etki yaparsanız, ayarlama işleminden en çok faydalanabilecek sorguları hızlı bir şekilde görürsünüz.


Süre, cpu ve okumaların temel eşikleri olarak ne kullanıyorsunuz?
Bill Paetzke

Bu uygulamaya bağlı, ancak süre ile başlardım> (maksimum süre herhangi bir kullanıcının bir şeyi beklemesini isterdim); Çok yüksek, 10 saniye veya daha fazla başlarsanız, hiçbir şey alamazsanız, harika, biraz geriye. Üstüne "yüzer" bazı sürprizlerin olacağının garantisi.
SqlACID

..ve süre ile başlayacağım, yalnızca CPU'ya bağlı olduğunuzu düşünüyorsanız CPU kullanın, G / Ç'ye bağlıysanız sayaçları okuyun veya yazın, ancak darboğazların nerede yattığından emin değilseniz süre kullanın veya , dediğin gibi, olup bitenler hakkında bir fikir edinmeye çalışıyorum.
SqlACID
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.