Apakah boleh menjalankan perfmon di server produksi? Dan mengapa?

28

Atau apakah perfmon harus dibatasi pada server Dev / QA dengan tes beban yang mensimulasikan aktivitas produksi?

Saya ingin menjalankan perfmon selama dua hari ( seperti yang disarankan oleh master Sql Server, Brent Ozar ) untuk mendapatkan gambaran keseluruhan kinerja database aplikasi web saya.

Bill Paetzke
sumber
1
Beberapa orang menyarankan menggunakan Jejak SQL - berhati-hatilah dengan jejak SQL dan jangan pernah melacak semua aktivitas di server prod.
Sam

Jawaban:

26

SQL Server, dan sebagian besar produk lainnya, menghasilkan penghitung sepanjang waktu, tidak peduli apakah ada pendengar atau tidak (mengabaikan opsi -x startup). Counter tracing sepenuhnya transparan pada aplikasi yang dipantau. Ada wilayah memori bersama di mana aplikasi yang dipantau menulis dan dari mana sesi pemantauan membaca nilai mentah pada interval yang ditentukan. Jadi satu-satunya biaya yang terkait dengan pemantauan adalah biaya proses pemantauan dan biaya untuk menulis nilai-nilai sampel ke disk. Memilih interval pengumpulan yang layak (saya biasanya memilih 15 detik) dan sejumlah moderat penghitung (50-100), dan menulis ke dalam format file biner biasanya tidak meninggalkan dampak pada sistem yang dipantau.

Tapi saya akan merekomendasikan untuk tidak menggunakan Perfmon (seperti pada perfmon.exe). Alih-alih membiasakan diri dengan logman.exe, lihat Deskripsi Alat Logman.exe, Relog.exe, dan Typeperf.exe . Dengan cara ini Anda tidak mengikat sesi pengumpulan ke sesi Anda. Logman, sebagai alat baris perintah, dapat digunakan dalam skrip dan pekerjaan terjadwal untuk memulai dan menghentikan sesi pengumpulan.

Remus Rusanu
sumber
Saya menggunakan TypePerf.exe dengan DSN untuk memasukkan data langsung ke tabel. Ada db terpisah untuk mereka. Apakah dengan cara apa pun akan memengaruhi?
UdIt Solanki
14

Tidak ada yang salah dengan menjalankan perfmon di kotak produksi. Kunci relatif rendah, dan dapat mengumpulkan banyak info bagus untuk Anda. Dan bagaimana Anda secara akurat mensimulasikan beban produksi jika Anda tidak menjalankan beberapa analisis pada server produksi? Dari Brent Ozar di tautan Anda sendiri:

Biarkan Perfmon berjalan selama satu atau dua hari untuk mengumpulkan garis dasar yang baik dari aktivitas server. Ini tidak invasif pada SQL Server yang dipantau, dan hasil mendalam akan terbayar. Semakin banyak data yang kita miliki, semakin baik pekerjaan yang dapat kita lakukan untuk menganalisis hasil Perfmon.

Saya sudah menjalankan perfmon di sejumlah kotak Exchange produksi tanpa efek samping.

Holokriptik
sumber
5
Setuju - tidak ada overhead dari menjalankan Perfmon. Jawaban lain menyarankan menjalankan Profiler alih-alih Perfmon, tetapi ada overhead yang sangat nyata untuk menjalankan Profiler. Saya telah melihat jejak Profiler menurunkan server produksi ketika kotak penelusuran tidak dapat mengikuti beban, atau ketika beban tambahan mendorong server produksi melewati batas.
Brent Ozar
Terima kasih telah berdentang di @Brent. Omong-omong, saya membeli buku internal 2008 Anda kemarin.
Bill Paetzke
Ah, keren! Biarkan saya tahu apa yang Anda pikirkan tentang itu.
Brent Ozar
7

Sejak saya mendengarkan Clint Huffman , yang menulis PAL utilitas untuk menganalisis Perfmon Logs, di podcast sekali. Saya telah mengatur apa yang saya sebut Perekam Penerbangan di semua server aplikasi produksi kami. Praktik ini sangat berguna untuk mendiagnosis masalah dan memantau tren.

Di bawah ini adalah skrip yang saya gunakan untuk mengatur Perfmon Collector yang memulai secara otomatis, dengan pembersihan log. Jika diinginkan, itu bisa diumpankan file penghitung kinerja daftar untuk mengumpulkan (satu per baris) atau file XML Ambang Batas PAL. Saya suka menggunakan file Threshold 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
Nathan Hartley
sumber
Apakah skrip ini memerlukan sesuatu untuk diinstal (PAL atau apa pun)? Bisakah Anda memberikan sampel file output yang dihasilkannya jika memungkinkan? Maaf saya tidak tahu PowerShell.
CodingYoshi
Tidak ada yang dipasang. Skrip ini mengonfigurasi fitur Windows asli. Itu menciptakan kolektor PerMon, ditambah dua tugas yang dijadwalkan. Satu tugas, mulai kolektor PerfMon setelah reboot. Tugas lainnya, membersihkan file log lama. Jika Anda ingin menganalisis file PerfMon Anda dengan PAL, saya akan merekomendasikan PAL di-setup dan dijalankan pada server non-produksi. Untuk pengaturan yang mudah, ini akan membaca file konfigurasi PAL.
Nathan Hartley
3

Kami cukup sering melakukannya. Ini juga penting untuk menetapkan garis dasar di lingkungan nyata, sehingga Anda dapat membandingkan nanti jika ada masalah atau Anda perlu melakukan studi kapasitas.

Saya sarankan tidak pergi di bawah interval 10 detik. Jika Anda mengumpulkan banyak objek / penghitung dan intervalnya terlalu sering, ini dapat memengaruhi pengoperasian.

Microsoft memiliki PerfMon Wizard yang akan mengatur tugas untuk Anda.

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

Greg Askew
sumber
Saya melihat bahwa PerfMon Wizard dirilis pada tahun 2004. Saya bertanya-tanya apakah itu standar dengan SQL Server 2005.
Bill Paetzke
Saya pikir versi itu masih terkini.
Greg Askew
2

Di dunia yang ideal di mana server produksi persis mencerminkan apa yang server dev, lakukan dan juga merupakan duplikat yang tepat dari server dev, perfmon seharusnya tidak diperlukan pada server produksi karena hasilnya akan sama dengan yang ada di server dev. Tentu saja situasi mistis itu tidak pernah terjadi, jadi kita perlu menjalankan perfmon di server produksi dan sama sekali tidak ada yang salah dengan itu. Di antara hal-hal lain, kita mungkin perlu menggunakan perfmon dan alat lain untuk mempelajari mengapa server produksi tidak berperilaku sama dengan server dev.

John Gardeniers
sumber
2

Mengapa perfmon Maksud saya, versi terbaru dari SQL server memiliki metode mereka sendiri untuk melakukan itu termasuk membangun gudang data (pusat) dari penghitung kinerja yang kemudian dapat ditanyakan dan dilaporkan. Tidak ada gunanya menjalankan perfmon di sana.

Saya, seperti biasa, heran dengan semua posting di sini dari orang-orang yang jelas tidak pernah membaca dokumentasi;)

http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/ adalah awal yang baik. IMHO yang seharusnya bekerja pada hampir setiap sql server yang digunakan untuk keperluan produksi.

TomTom
sumber
1

Tidak ada yang salah dengan menjalankan Perfmon seperti yang disarankan banyak orang, tetapi saya akan menjalankan Profiler sebagai gantinya atau sebagai tambahan, dengan peringatan yang sama, jangan menangkap terlalu banyak terlalu sering, cukup tangkap query yang berjalan lama, yaitu durasi> x detik, atau cpu> xx , atau membaca> xxxx; dampaknya sangat kecil, dan Anda akan segera melihat pertanyaan yang paling diuntungkan dari penyetelan.

SqlACID
sumber
apa yang Anda gunakan sebagai ambang dasar durasi, cpu, dan membaca?
Bill Paetzke
Tergantung pada aplikasinya, tetapi saya akan mulai dengan durasi> (waktu maksimal saya ingin ada pengguna yang menunggu apa pun); mulai terlalu tinggi, 10 detik atau lebih, jika Anda tidak mendapatkan apa-apa, bagus, mundurlah sedikit. Dijamin Anda akan memiliki beberapa kejutan "melayang" ke atas.
SqlACID
..dan saya akan mulai dengan durasi, hanya menggunakan CPU jika Anda pikir Anda terikat dengan CPU, membaca atau menulis penghitung jika Anda terikat dengan I / O, tetapi gunakan durasi jika Anda tidak yakin di mana letak hambatannya, atau hanya , seperti yang Anda katakan, mencoba merasakan apa yang terjadi.
SqlACID