web-dev-qa-db-ja.com

本番サーバーでperfmonを実行しても問題ありませんか?なぜ?

または、perfmonは、運用アクティビティをシミュレートする負荷テストを備えたDev/QAサーバーに制限する必要がありますか?

Perfmonを2日間実行して( Sql ServerマスターのBrent Ozarが示唆しているように )、私のWebアプリのデータベースパフォーマンスの全体的な感触を取得します。

29
Bill Paetzke

SQL Serverおよび他のほとんどの製品は、リスナーの有無に関係なく、常にカウンターを生成します(-x起動オプションを無視)。カウンタートレースは、監視対象のアプリケーションに対して完全に透過的です。監視対象のアプリケーションが書き込み、指定された間隔で未加工の値を監視セッションが読み取る共有メモリ領域があります。したがって、監視に関連する唯一のコストは、監視プロセスのコストと、サンプリングされた値をディスクに書き込むコストです。まともな収集間隔(通常は15秒を選択します)と適度な数のカウンター(50〜100)を選択し、バイナリファイル形式に書き込んでも、通常は監視対象システムに影響はありません。

ただし、(perfmon.exeのように)Perfmonを使用しないことをお勧めします。代わりに、logman.exeをよく理解してください。 Logman.exe、Relog.exe、およびTypeperf.exeツールの説明 を参照してください。このようにして、コレクションセッションをセッションに関連付けないでください。コマンドラインツールであるLogmanは、スクリプトおよびスケジュールされたジョブで使用して、収集セッションを開始および停止できます。

27
Remus Rusanu

本番環境のボックスでperfmonを実行しても問題はありません。それは比較的低いキーであり、あなたのために多くの良い情報を集めることができます。また、運用サーバーで分析を実行しなかった場合、運用負荷をどのように正確にシミュレートしますか?あなた自身のリンクのブレントオザーから:

Perfmonを1〜2日実行して、サーバーのアクティビティの適切なベースラインを収集します。監視対象のSQL Serverにそれほど侵襲的ではなく、詳細な結果が報われます。データが多ければ多いほど、Perfmonの結果を分析する上で優れた作業を行うことができます。

Perfmonをいくつかの運用Exchangeボックスで実行しましたが、悪影響はありません。

15
Holocryptic

[〜#〜] pal [〜#〜] を書いた Clint Huffman をポッドキャストで一度ポッドキャストで聞いて以来、すべての運用アプリケーションサーバーで、Flight Recorderと呼ばれるものをセットアップしました。この方法は、問題の診断と傾向の監視に非常に役立ちます。

以下は、ログのパージを使用して、自動起動のPerfmon Collectorをセットアップするために使用するスクリプトです。必要に応じて、収集するパフォーマンスカウンターをリストするファイル(1行に1つ)またはPALしきい値XMLファイルを提供できます。 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
8
Nathan Hartley

私たちはそれをかなり頻繁に行います。また、実際の環境でベースラインを確立するためにも不可欠であるため、問題がある場合やキャパシティスタディを実行する必要がある場合は後で比較できます。

ただし、10秒間隔を下回らないことをお勧めします。多数のオブジェクト/カウンターを収集していて、間隔が多すぎる場合、操作に影響を与える可能性があります。

MicrosoftにはPerfMon Wizardがあり、タスクを設定します。

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

3
Greg Askew

本番サーバーがdevサーバーの動作を正確に反映し、devサーバーの完全な複製でもある理想的な世界では、perfmonは本番サーバーでは必要ありません。結果はdevサーバーの場合と同じになるためです。もちろん、その神話的な状況は決して発生しないので、本番サーバーでperfmonを実行する必要がありますが、これにはまったく問題はありません。特に、運用サーバーが開発サーバーと同じように動作しない理由を知るには、perfmonやその他のツールを使用する必要がある場合があります。

2
John Gardeniers

なぜperfmon?つまり、SQLサーバーの最近のバージョンには、パフォーマンスカウンターの(中央)データウェアハウスを構築する独自の方法があり、クエリを実行してレポートすることができます。そこでperfmonを実行する意味はありません。

私はいつものように、明らかにドキュメントを決して読んだことがない人々のここにあるすべての投稿に驚いています;)

http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/ は良いスタートです。運用目的で使用されるほとんどすべてのSQLサーバーで機能するはずの私見。

2
TomTom

多くの人が示唆しているように、Perfmonの実行に問題はありませんが、代わりに、または同じ警告でプロファイラーを実行し、あまり頻繁にキャプチャせず、実行時間の長いクエリ(つまり、継続時間> x秒、またはcpu> xx)のみをキャプチャします、または> xxxxを読み取ります。影響はほとんどなく、チューニングから最も恩恵を受けるクエリがすぐにわかります。

1
SqlACID