프로덕션 서버에서 perfmon을 실행해도 괜찮습니까? 그리고 왜?


28

아니면 perfmon을 프로덕션 활동을 시뮬레이트하는로드 테스트가있는 Dev / QA 서버로 제한해야합니까?

웹 응용 프로그램의 데이터베이스 성능에 대한 전반적인 느낌을 얻으려면 이틀 동안 perfmon을 실행하고 싶습니다 ( Sql Server 마스터 Brent Ozar가 제안한 것처럼 ).


1
일부 사람들은 SQL 추적 사용을 제안했습니다. SQL 추적에주의하고 prod 서버의 모든 활동을 추적하지 마십시오.
Sam

답변:


26

SQL Server 및 대부분의 다른 제품은 리스너가 있는지 여부에 관계없이 항상 카운터를 생성합니다 (-x 시작 옵션 무시). 카운터 추적은 모니터링중인 응용 프로그램에서 완전히 투명합니다. 모니터링되는 응용 프로그램이 작성되고 모니터링 세션에서 지정된 간격으로 원시 값을 읽는 공유 메모리 영역이 있습니다. 따라서 모니터링과 관련된 유일한 비용은 모니터링 프로세스 비용과 샘플링 된 값을 디스크에 쓰는 데 드는 비용입니다. 적절한 수집 간격 (보통 15 초 선택)과 적당한 수의 카운터 (50-100)를 선택하고 이진 파일 형식으로 쓰는 것은 일반적으로 모니터링되는 시스템에 영향을 미치지 않습니다.

그러나 perfmon (perfmon.exe에서와 같이)을 사용하지 않는 것이 좋습니다. 대신 logman.exe에 익숙해 지십시오 . Logman.exe, Relog.exe 및 Typeperf.exe 도구 설명을 참조하십시오 . 이렇게하면 수집 세션을 세션에 연결하지 않습니다. 명령 행 도구 인 Logman은 스크립트 및 스케줄 된 작업에서 콜렉션 세션을 시작 및 중지하는 데 사용될 수 있습니다.


DSN과 함께 TypePerf.exe를 사용하여 데이터를 테이블에 직접 삽입하고 있습니다. 별도의 db가 있습니다. 어떤 식 으로든 영향을 미칩니 까?
UdIt Solanki

14

프로덕션 박스에서 perfmon을 실행하는 데 아무런 문제가 없습니다. 키가 상대적으로 낮으며 많은 유용한 정보를 수집 할 수 있습니다. 프로덕션 서버에서 일부 분석을 실행하지 않은 경우 프로덕션로드를 정확하게 시뮬레이션하는 방법은 무엇입니까? 자신의 링크에서 브렌트 오자르 :

서버 활동의 좋은 기준을 수집하기 위해 하루나 이틀 동안 Perfmon을 실행 시키십시오. 모니터링되는 SQL Server에 대한 침입은 아니며 심층적 인 결과가 나옵니다. 데이터가 많을수록 Perfmon 결과 분석에서 더 나은 작업을 수행 할 수 있습니다.

나는 부작용없이 많은 프로덕션 Exchange 상자에서 perfmon을 실행했습니다.


5
동의 함-Perfmon을 실행하면 오버 헤드가 없습니다. 또 다른 대답은 Perfmon 대신 Profiler를 실행하는 것을 제안했지만 Profiler를 실행하는 데 실제로 오버 헤드가 있습니다. 추적 상자가로드를 따라 잡을 수 없거나 추가로드로 인해 프로덕션 서버가 엣지 위로 밀렸을 때 프로파일 러 추적이 프로덕션 서버를 중단시키는 것을 보았습니다.
브렌트 오자르

@Brent의 chiming 주셔서 감사합니다. 그건 그렇고, 나는 당신의 2008 내부 도서를 어제 구입했습니다 .
Bill Paetzke

아 멋지다! 당신이 어떻게 생각하는지 알려주세요.
브렌트 오자르

7

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

이 스크립트를 설치해야합니까 (PAL 또는 기타)? 가능하면 생성 된 출력 파일의 샘플을 제공해 주시겠습니까? PowerShell을 몰라 죄송합니다.
CodingYoshi

설치할 것이 없습니다. 이 스크립트는 기본 Windows 기능을 구성합니다. PerMon 수집기와 두 개의 예약 된 작업을 만듭니다. 하나의 작업은 재부팅 후 PerfMon 수집기를 시작합니다. 다른 작업은 오래된 로그 파일을 정리합니다. PAL을 사용하여 PerfMon 파일을 분석하려면 프로덕션이 아닌 서버에서 PAL을 설정하고 실행하는 것이 좋습니다. 쉬운 설정을 위해 PAL 구성 파일을 읽습니다.
Nathan Hartley

3

우리는 아주 자주합니다. 또한 실제 환경에서 기준을 설정하는 데 필수적이므로 문제가 있거나 용량 연구를 수행해야하는 경우 나중에 비교할 수 있습니다.

그래도 10 초 간격을 넘지 않는 것이 좋습니다. 많은 개체 / 카운터를 수집하고 간격이 너무 자주 발생하면 작업에 영향을 줄 수 있습니다.

Microsoft에는 작업을 설정하는 PerfMon 마법사가 있습니다.

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


나는 SQL Server 2005에 기본으로 제공하는 경우 성능 모니터 마법사 2004 I 경이에 출시 된 것을 볼
빌 Paetzke

나는 그 버전이 여전히 최신이라고 생각한다.
Greg Askew

2

프로덕션 서버가 dev 서버의 기능을 정확하게 미러링하고 dev 서버의 정확한 복제 본인 이상적인 세계에서는 결과가 dev 서버의 결과와 동일하기 때문에 프로덕션 서버에서 perfmon이 필요하지 않아야합니다. 물론 신화적인 상황은 결코 일어나지 않으므로 프로덕션 서버에서 perfmon을 실행해야하며 그에 아무런 문제가 없습니다. 무엇보다도 프로덕션 서버가 dev 서버와 동일하게 작동하지 않는 이유를 배우기 위해 perfmon 및 기타 도구를 사용해야 할 수도 있습니다.


2

왜 perfmon? 최신 버전의 SQL Server에는 쿼리하고보고 할 수있는 성능 카운터의 (중앙) 데이터웨어 하우스를 구축하는 등 자체적 인 방법이 있습니다. perfmon을 실행하는 데는 의미가 없습니다.

나는 분명히 문서를 읽지 않은 사람들의 모든 게시물에 항상 놀랐습니다.)

http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/ 는 좋은 시작입니다. 프로덕션 용도로 사용되는 거의 모든 SQL Server에서 작동해야하는 IMHO.


1

많은 사람들이 제안한 것처럼 Perfmon을 실행하는 데 아무런 문제가 없지만 동일한 경고로 프로파일 러를 대신 또는 추가로 너무 자주 캡처하지 않고 장시간 실행되는 쿼리 (예 : 지속 시간> x 초 또는 CPU> xx)를 캡처하지 않습니다. 또는 xxxx 이상을 읽습니다. 거의 영향을 미치지 않으며 튜닝에서 가장 도움이되는 쿼리를 빠르게 볼 수 있습니다.


지속 시간, CPU 및 읽기의 기본 임계 값으로 무엇을 사용합니까?
Bill Paetzke

앱에 따라 다르지만 duration> (최대 사용자가 무엇이든 기다릴 수있는 최대 시간)로 시작합니다. 아무 것도 얻지 못하면 조금 뒤로 물러서십시오. 당신이 정상에 "부동"깜짝 선물을 보장합니다.
SqlACID

.. 그리고 지속 시간으로 시작하고, I / O 바운드 인 경우 CPU 바운드, 읽기 또는 쓰기 카운터라고 생각되는 경우에만 CPU를 사용하지만 병목 현상이 어디에 있는지 확실하지 않은 경우 지속 시간을 사용하십시오. , 당신이 말했듯이, 무슨 일이 일어나고 있는지 느끼려고 노력하십시오.
SqlACID
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.