ตกลงเพื่อเรียกใช้ perfmon บนเซิร์ฟเวอร์ที่ใช้งานจริงหรือไม่? และทำไม?


28

หรือควร จำกัด เฉพาะเซิร์ฟเวอร์ Dev / QA ด้วยการทดสอบโหลดที่จำลองกิจกรรมการผลิต?

ฉันต้องการเรียกใช้ perfmon เป็นเวลาสองวัน ( เช่น Sql Server master Brent Ozar แนะนำ ) เพื่อรับความรู้สึกโดยรวมของประสิทธิภาพการทำงานของฐานข้อมูลของแอปบนเว็บ


1
บางคนแนะนำให้ใช้การติดตาม SQL - ระมัดระวังการติดตาม SQL และอย่าติดตามกิจกรรมทั้งหมดบนเซิร์ฟเวอร์ที่ผลิต
Sam

คำตอบ:


26

SQL Server และผลิตภัณฑ์อื่น ๆ ส่วนใหญ่จะสร้างตัวนับตลอดเวลาไม่ว่าจะมีฟังหรือไม่ก็ตาม (ไม่สนใจตัวเลือกการเริ่มต้น -x) การติดตามตัวนับมีความโปร่งใสอย่างสมบูรณ์ในแอปพลิเคชันที่กำลังตรวจสอบ มีขอบเขตหน่วยความจำที่แบ่งใช้ซึ่งแอ็พพลิเคชันที่ถูกมอนิเตอร์เขียนและเซสชันการมอนิเตอร์ที่อ่านค่าดิบ ณ ช่วงเวลาที่ระบุ ดังนั้นต้นทุนเดียวที่เกี่ยวข้องกับการตรวจสอบคือต้นทุนของกระบวนการตรวจสอบและค่าใช้จ่ายในการเขียนค่าตัวอย่างไปยังดิสก์ การเลือกช่วงเวลาการรวบรวมที่เหมาะสม (โดยปกติฉันจะเลือก 15 วินาที) และจำนวนตัวนับปานกลาง (50-100) และการเขียนลงในรูปแบบไฟล์ไบนารีโดยทั่วไปจะไม่มีผลกระทบต่อระบบที่ถูกตรวจสอบ

แต่ฉันไม่แนะนำให้ใช้ Perfmon (เช่นเดียวกับใน perfmon.exe) แทนที่จะได้รับตัวเองคุ้นเคยกับกับ Logman.exe ดูคำอธิบายของ Logman.exe, Relog.exe และเครื่องมือ วิธีนี้คุณจะไม่ผูกเซสชันคอลเลกชันกับเซสชันของคุณ Logman ซึ่งเป็นเครื่องมือบรรทัดคำสั่งสามารถใช้ในสคริปต์และงานที่กำหนดเวลาเพื่อเริ่มและหยุดเซสชันการรวบรวม


ฉันใช้ TypePerf.exe กับ DSN เพื่อแทรกข้อมูลลงในตารางโดยตรง มีฐานข้อมูลแยกต่างหากสำหรับพวกเขา จะมีผลกระทบหรือไม่?
UdIt Solanki

14

ไม่มีอะไรผิดปกติกับการวิ่ง perfmon บนกล่องผลิต มันเป็นคีย์ที่ค่อนข้างต่ำและสามารถรวบรวมข้อมูลที่ดีมากมายสำหรับคุณ และคุณจะจำลองการโหลดการผลิตอย่างแม่นยำได้อย่างไรถ้าคุณไม่ได้ทำการวิเคราะห์บนเซิร์ฟเวอร์การผลิต จาก Brent Ozar ในลิงค์ของคุณเอง:

ปล่อยให้ Perfmon ทำงานสักวันหรือสองวันเพื่อรวบรวมพื้นฐานที่ดีของกิจกรรมเซิร์ฟเวอร์ ไม่ใช่การรุกรานบน SQL Server ที่ถูกตรวจสอบและผลลัพธ์เชิงลึกจะชำระ ยิ่งเรามีข้อมูลมากเท่าไหร่งานที่ดีกว่าที่เราสามารถทำได้ก็คือการวิเคราะห์ผลลัพธ์ของ Perfmon

ฉันใช้ perfmon กับกล่องแลกเปลี่ยนผลิตจำนวนหนึ่งโดยไม่มีผลกระทบใด ๆ


5
ตกลง - ไม่มีค่าใช้จ่ายจากการเรียกใช้ Perfmon อีกคำตอบหนึ่งที่แนะนำให้เรียกใช้ Profiler แทนที่จะเป็น Perfmon แต่มีค่าใช้จ่ายที่แท้จริงในการใช้ Profiler ฉันเคยเห็นการติดตามของ Profiler ทำให้เซิร์ฟเวอร์ที่ใช้งานจริงไม่ทำงานเมื่อกล่องการติดตามไม่สามารถติดตามการโหลดหรือเมื่อการโหลดที่เพิ่มเข้ามาทำให้เซิร์ฟเวอร์ที่ใช้งานอยู่เหนือ
เบรนต์โอซาร์

ขอบคุณสำหรับการตีระฆังใน @Brent โดยวิธีการที่ฉันซื้อหนังสือภายในปี 2008ของคุณเมื่อวานนี้
Bill Paetzke

อ๋อ! แจ้งให้เราทราบว่าคุณคิดอย่างไร
Brent Ozar

7

นับตั้งแต่ฉันฟังClint Huffmanผู้เขียนPALเป็นยูทิลิตี้สำหรับการวิเคราะห์บันทึก Perfmon ในพอดคาสต์หนึ่งครั้ง ฉันได้ตั้งค่าสิ่งที่ฉันเรียกว่า Flight Recorder บนเซิร์ฟเวอร์แอปพลิเคชันที่ใช้งานจริงทั้งหมดของเรา การฝึกฝนนี้มีประโยชน์อย่างมากสำหรับการวินิจฉัยปัญหาและติดตามแนวโน้ม

ด้านล่างเป็นสคริปต์ที่ฉันใช้ในการตั้งค่า Perfmon Collector ที่เริ่มต้นโดยอัตโนมัติพร้อมการล้างข้อมูลบันทึก หากต้องการสามารถป้อนรายชื่อเคาน์เตอร์วัดประสิทธิภาพเพื่อรวบรวม (หนึ่งรายการต่อบรรทัด) หรือไฟล์ PAL Threshold XML ฉันชอบใช้ไฟล์ PAL Threshold

<#
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
เข้ารหัสโยชิ

ไม่มีอะไรจะติดตั้ง สคริปต์นี้กำหนดค่าคุณลักษณะดั้งเดิมของ Windows มันสร้างตัวสะสม PerMon รวมถึงงานที่กำหนดไว้สองงาน ภารกิจหนึ่งเริ่มสะสม PerfMon หลังจากรีบูต งานอื่น ๆ ล้างไฟล์บันทึกเก่า หากคุณต้องการวิเคราะห์ไฟล์ PerfMon ของคุณด้วย PAL ฉันขอแนะนำให้ PAL ติดตั้งและรันบนเซิร์ฟเวอร์ที่ไม่ได้ใช้งานจริง เพื่อการตั้งค่าที่ง่ายนี่จะอ่านไฟล์กำหนดค่า PAL
Nathan Hartley

3

เราทำค่อนข้างบ่อย นอกจากนี้ยังจำเป็นสำหรับการสร้างพื้นฐานในสภาพแวดล้อมจริงเพื่อให้คุณสามารถเปรียบเทียบในภายหลังหากมีปัญหาหรือคุณจำเป็นต้องทำการศึกษาความสามารถ

ฉันไม่แนะนำให้ลงไปต่ำกว่าช่วงเวลา 10 วินาที หากคุณกำลังรวบรวมวัตถุ / ตัวนับจำนวนมากและช่วงเวลานั้นบ่อยเกินไปก็อาจส่งผลกระทบต่อการดำเนินการ

Microsoft มีตัวช่วยสร้าง PerfMon ที่จะตั้งค่างานให้คุณ

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


ฉันเห็นว่าตัวช่วยสร้าง PerfMon เปิดตัวในปี 2004 ฉันสงสัยว่ามันมาพร้อมกับมาตรฐานของ SQL Server 2005 หรือไม่
Bill Paetzke

ฉันคิดว่าเวอร์ชั่นนั้นยังคงเป็นปัจจุบัน
เกร็ก Askew

2

ในโลกอุดมคติที่เซิร์ฟเวอร์การผลิตสะท้อนให้เห็นถึงสิ่งที่เซิร์ฟเวอร์ dev ทำและยังเป็นสำเนาที่เหมือนกันของเซิร์ฟเวอร์ dev นั้นไม่จำเป็นต้องมี perfmon บนเซิร์ฟเวอร์ที่ใช้งานจริงเพราะผลลัพธ์จะเหมือนกับที่อยู่บนเซิร์ฟเวอร์ dev แน่นอนว่าสถานการณ์ในตำนานไม่เคยเกิดขึ้นดังนั้นเราจึงจำเป็นต้องเรียกใช้ perfmon บนเซิร์ฟเวอร์ที่ใช้งานจริงและไม่มีอะไรผิดปกติกับสิ่งนั้น ท่ามกลางสิ่งอื่น ๆ เราอาจต้องใช้ perfmon และเครื่องมืออื่น ๆ เพื่อเรียนรู้ว่าเหตุใดเซิร์ฟเวอร์ที่ใช้งานจริงจึงไม่ทำงานเหมือนเซิร์ฟเวอร์ dev


2

ทำไมต้อง perfmon ฉันหมายความว่าเซิร์ฟเวอร์ SQL รุ่นล่าสุดมีวิธีการของตัวเองในการทำเช่นนั้นรวมถึงการสร้างคลังข้อมูล (ส่วนกลาง) ของเคาน์เตอร์วัดประสิทธิภาพซึ่งสามารถสอบถามและรายงานได้ ไม่มีความหมายในการใช้ perfmon ที่นั่น

ฉันเป็นเช่นเคยประหลาดใจโดยโพสต์ทั้งหมดที่นี่ของคนที่เห็นได้ชัดว่าไม่เคยอ่านเอกสาร;)

http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/เป็นการเริ่มต้นที่ดี IMHO ที่ควรทำงานกับเซิร์ฟเวอร์ sql เกือบทุกตัวที่ใช้เพื่อการผลิต


1

ไม่มีอะไรผิดปกติกับการเรียกใช้ Perfmon ตามที่หลายคนแนะนำ แต่ฉันจะเรียกใช้ Profiler แทนหรือเพิ่มเติมจากที่มี caveats เดียวกันไม่จับภาพบ่อยเกินไปเพียงแค่จับคิวรี่ที่รันนานเช่นระยะเวลา> x วินาทีหรือ cpu> xx หรืออ่าน> xxxx; มีผลกระทบเพียงเล็กน้อยและคุณจะเห็นข้อความค้นหาที่จะได้รับประโยชน์สูงสุดจากการปรับแต่งอย่างรวดเร็ว


คุณใช้อะไรเป็นเกณฑ์ระยะเวลาพื้นฐานซีพียูและการอ่าน
Bill Paetzke

มันขึ้นอยู่กับแอพ แต่ฉันจะเริ่มด้วยระยะเวลา> (เวลาสูงสุดฉันต้องการให้ผู้ใช้รออะไร); เริ่มสูงเกินไป 10 วินาทีหรือมากกว่านั้นถ้าคุณไม่ได้อะไรที่ยอดเยี่ยมกลับลงมาเล็กน้อย รับรองว่าคุณจะมีความประหลาดใจ "ลอย" ไปด้านบน
SqlACID

.. และฉันจะเริ่มต้นด้วยระยะเวลาใช้ CPU เฉพาะถ้าคุณคิดว่าคุณเป็น CPU-bound อ่านหรือเขียนเคาน์เตอร์ถ้าคุณเป็น I / O-ผูก แต่ใช้ระยะเวลาถ้าคุณไม่แน่ใจว่าที่คอขวดอยู่หรือเพียง อย่างที่คุณพูดพยายามทำความเข้าใจกับสิ่งที่เกิดขึ้น
SqlACID
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.