หรือควร จำกัด เฉพาะเซิร์ฟเวอร์ Dev / QA ด้วยการทดสอบโหลดที่จำลองกิจกรรมการผลิต?
ฉันต้องการเรียกใช้ perfmon เป็นเวลาสองวัน ( เช่น Sql Server master Brent Ozar แนะนำ ) เพื่อรับความรู้สึกโดยรวมของประสิทธิภาพการทำงานของฐานข้อมูลของแอปบนเว็บ
หรือควร จำกัด เฉพาะเซิร์ฟเวอร์ Dev / QA ด้วยการทดสอบโหลดที่จำลองกิจกรรมการผลิต?
ฉันต้องการเรียกใช้ perfmon เป็นเวลาสองวัน ( เช่น Sql Server master Brent Ozar แนะนำ ) เพื่อรับความรู้สึกโดยรวมของประสิทธิภาพการทำงานของฐานข้อมูลของแอปบนเว็บ
คำตอบ:
SQL Server และผลิตภัณฑ์อื่น ๆ ส่วนใหญ่จะสร้างตัวนับตลอดเวลาไม่ว่าจะมีฟังหรือไม่ก็ตาม (ไม่สนใจตัวเลือกการเริ่มต้น -x) การติดตามตัวนับมีความโปร่งใสอย่างสมบูรณ์ในแอปพลิเคชันที่กำลังตรวจสอบ มีขอบเขตหน่วยความจำที่แบ่งใช้ซึ่งแอ็พพลิเคชันที่ถูกมอนิเตอร์เขียนและเซสชันการมอนิเตอร์ที่อ่านค่าดิบ ณ ช่วงเวลาที่ระบุ ดังนั้นต้นทุนเดียวที่เกี่ยวข้องกับการตรวจสอบคือต้นทุนของกระบวนการตรวจสอบและค่าใช้จ่ายในการเขียนค่าตัวอย่างไปยังดิสก์ การเลือกช่วงเวลาการรวบรวมที่เหมาะสม (โดยปกติฉันจะเลือก 15 วินาที) และจำนวนตัวนับปานกลาง (50-100) และการเขียนลงในรูปแบบไฟล์ไบนารีโดยทั่วไปจะไม่มีผลกระทบต่อระบบที่ถูกตรวจสอบ
แต่ฉันไม่แนะนำให้ใช้ Perfmon (เช่นเดียวกับใน perfmon.exe) แทนที่จะได้รับตัวเองคุ้นเคยกับกับ Logman.exe ดูคำอธิบายของ Logman.exe, Relog.exe และเครื่องมือ วิธีนี้คุณจะไม่ผูกเซสชันคอลเลกชันกับเซสชันของคุณ Logman ซึ่งเป็นเครื่องมือบรรทัดคำสั่งสามารถใช้ในสคริปต์และงานที่กำหนดเวลาเพื่อเริ่มและหยุดเซสชันการรวบรวม
ไม่มีอะไรผิดปกติกับการวิ่ง perfmon บนกล่องผลิต มันเป็นคีย์ที่ค่อนข้างต่ำและสามารถรวบรวมข้อมูลที่ดีมากมายสำหรับคุณ และคุณจะจำลองการโหลดการผลิตอย่างแม่นยำได้อย่างไรถ้าคุณไม่ได้ทำการวิเคราะห์บนเซิร์ฟเวอร์การผลิต จาก Brent Ozar ในลิงค์ของคุณเอง:
ปล่อยให้ Perfmon ทำงานสักวันหรือสองวันเพื่อรวบรวมพื้นฐานที่ดีของกิจกรรมเซิร์ฟเวอร์ ไม่ใช่การรุกรานบน SQL Server ที่ถูกตรวจสอบและผลลัพธ์เชิงลึกจะชำระ ยิ่งเรามีข้อมูลมากเท่าไหร่งานที่ดีกว่าที่เราสามารถทำได้ก็คือการวิเคราะห์ผลลัพธ์ของ Perfmon
ฉันใช้ perfmon กับกล่องแลกเปลี่ยนผลิตจำนวนหนึ่งโดยไม่มีผลกระทบใด ๆ
นับตั้งแต่ฉันฟัง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
เราทำค่อนข้างบ่อย นอกจากนี้ยังจำเป็นสำหรับการสร้างพื้นฐานในสภาพแวดล้อมจริงเพื่อให้คุณสามารถเปรียบเทียบในภายหลังหากมีปัญหาหรือคุณจำเป็นต้องทำการศึกษาความสามารถ
ฉันไม่แนะนำให้ลงไปต่ำกว่าช่วงเวลา 10 วินาที หากคุณกำลังรวบรวมวัตถุ / ตัวนับจำนวนมากและช่วงเวลานั้นบ่อยเกินไปก็อาจส่งผลกระทบต่อการดำเนินการ
Microsoft มีตัวช่วยสร้าง PerfMon ที่จะตั้งค่างานให้คุณ
ในโลกอุดมคติที่เซิร์ฟเวอร์การผลิตสะท้อนให้เห็นถึงสิ่งที่เซิร์ฟเวอร์ dev ทำและยังเป็นสำเนาที่เหมือนกันของเซิร์ฟเวอร์ dev นั้นไม่จำเป็นต้องมี perfmon บนเซิร์ฟเวอร์ที่ใช้งานจริงเพราะผลลัพธ์จะเหมือนกับที่อยู่บนเซิร์ฟเวอร์ dev แน่นอนว่าสถานการณ์ในตำนานไม่เคยเกิดขึ้นดังนั้นเราจึงจำเป็นต้องเรียกใช้ perfmon บนเซิร์ฟเวอร์ที่ใช้งานจริงและไม่มีอะไรผิดปกติกับสิ่งนั้น ท่ามกลางสิ่งอื่น ๆ เราอาจต้องใช้ perfmon และเครื่องมืออื่น ๆ เพื่อเรียนรู้ว่าเหตุใดเซิร์ฟเวอร์ที่ใช้งานจริงจึงไม่ทำงานเหมือนเซิร์ฟเวอร์ dev
ทำไมต้อง perfmon ฉันหมายความว่าเซิร์ฟเวอร์ SQL รุ่นล่าสุดมีวิธีการของตัวเองในการทำเช่นนั้นรวมถึงการสร้างคลังข้อมูล (ส่วนกลาง) ของเคาน์เตอร์วัดประสิทธิภาพซึ่งสามารถสอบถามและรายงานได้ ไม่มีความหมายในการใช้ perfmon ที่นั่น
ฉันเป็นเช่นเคยประหลาดใจโดยโพสต์ทั้งหมดที่นี่ของคนที่เห็นได้ชัดว่าไม่เคยอ่านเอกสาร;)
http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/เป็นการเริ่มต้นที่ดี IMHO ที่ควรทำงานกับเซิร์ฟเวอร์ sql เกือบทุกตัวที่ใช้เพื่อการผลิต
ไม่มีอะไรผิดปกติกับการเรียกใช้ Perfmon ตามที่หลายคนแนะนำ แต่ฉันจะเรียกใช้ Profiler แทนหรือเพิ่มเติมจากที่มี caveats เดียวกันไม่จับภาพบ่อยเกินไปเพียงแค่จับคิวรี่ที่รันนานเช่นระยะเวลา> x วินาทีหรือ cpu> xx หรืออ่าน> xxxx; มีผลกระทบเพียงเล็กน้อยและคุณจะเห็นข้อความค้นหาที่จะได้รับประโยชน์สูงสุดจากการปรับแต่งอย่างรวดเร็ว