아니면 perfmon을 프로덕션 활동을 시뮬레이트하는로드 테스트가있는 Dev / QA 서버로 제한해야합니까?
웹 응용 프로그램의 데이터베이스 성능에 대한 전반적인 느낌을 얻으려면 이틀 동안 perfmon을 실행하고 싶습니다 ( Sql Server 마스터 Brent Ozar가 제안한 것처럼 ).
아니면 perfmon을 프로덕션 활동을 시뮬레이트하는로드 테스트가있는 Dev / QA 서버로 제한해야합니까?
웹 응용 프로그램의 데이터베이스 성능에 대한 전반적인 느낌을 얻으려면 이틀 동안 perfmon을 실행하고 싶습니다 ( Sql Server 마스터 Brent Ozar가 제안한 것처럼 ).
답변:
SQL Server 및 대부분의 다른 제품은 리스너가 있는지 여부에 관계없이 항상 카운터를 생성합니다 (-x 시작 옵션 무시). 카운터 추적은 모니터링중인 응용 프로그램에서 완전히 투명합니다. 모니터링되는 응용 프로그램이 작성되고 모니터링 세션에서 지정된 간격으로 원시 값을 읽는 공유 메모리 영역이 있습니다. 따라서 모니터링과 관련된 유일한 비용은 모니터링 프로세스 비용과 샘플링 된 값을 디스크에 쓰는 데 드는 비용입니다. 적절한 수집 간격 (보통 15 초 선택)과 적당한 수의 카운터 (50-100)를 선택하고 이진 파일 형식으로 쓰는 것은 일반적으로 모니터링되는 시스템에 영향을 미치지 않습니다.
그러나 perfmon (perfmon.exe에서와 같이)을 사용하지 않는 것이 좋습니다. 대신 logman.exe에 익숙해 지십시오 . Logman.exe, Relog.exe 및 Typeperf.exe 도구 설명을 참조하십시오 . 이렇게하면 수집 세션을 세션에 연결하지 않습니다. 명령 행 도구 인 Logman은 스크립트 및 스케줄 된 작업에서 콜렉션 세션을 시작 및 중지하는 데 사용될 수 있습니다.
프로덕션 박스에서 perfmon을 실행하는 데 아무런 문제가 없습니다. 키가 상대적으로 낮으며 많은 유용한 정보를 수집 할 수 있습니다. 프로덕션 서버에서 일부 분석을 실행하지 않은 경우 프로덕션로드를 정확하게 시뮬레이션하는 방법은 무엇입니까? 자신의 링크에서 브렌트 오자르 :
서버 활동의 좋은 기준을 수집하기 위해 하루나 이틀 동안 Perfmon을 실행 시키십시오. 모니터링되는 SQL Server에 대한 침입은 아니며 심층적 인 결과가 나옵니다. 데이터가 많을수록 Perfmon 결과 분석에서 더 나은 작업을 수행 할 수 있습니다.
나는 부작용없이 많은 프로덕션 Exchange 상자에서 perfmon을 실행했습니다.
PAL 에 Perfmon Logs 분석 용 유틸리티를 작성한 Clint Huffman의 이야기를 팟 캐스트에서 들어 본 이후로 한 번. 모든 프로덕션 응용 프로그램 서버에서 Flight Recorder라고하는 것을 설정했습니다. 이 방법은 문제를 진단하고 추세를 모니터링하는 데 매우 유용합니다.
아래는 로그 제거와 함께 자동 시작 Perfmon 수집기를 설정하는 데 사용하는 스크립트입니다. 원하는 경우 수집하는 성능 카운터 (한 줄에 하나씩) 또는 PAL 임계 값 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 마법사가 있습니다.
왜 perfmon? 최신 버전의 SQL Server에는 쿼리하고보고 할 수있는 성능 카운터의 (중앙) 데이터웨어 하우스를 구축하는 등 자체적 인 방법이 있습니다. perfmon을 실행하는 데는 의미가 없습니다.
나는 분명히 문서를 읽지 않은 사람들의 모든 게시물에 항상 놀랐습니다.)
http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/ 는 좋은 시작입니다. 프로덕션 용도로 사용되는 거의 모든 SQL Server에서 작동해야하는 IMHO.
많은 사람들이 제안한 것처럼 Perfmon을 실행하는 데 아무런 문제가 없지만 동일한 경고로 프로파일 러를 대신 또는 추가로 너무 자주 캡처하지 않고 장시간 실행되는 쿼리 (예 : 지속 시간> x 초 또는 CPU> xx)를 캡처하지 않습니다. 또는 xxxx 이상을 읽습니다. 거의 영향을 미치지 않으며 튜닝에서 가장 도움이되는 쿼리를 빠르게 볼 수 있습니다.