運用サーバーでperfmonを実行しても大丈夫ですか?なぜ?


28

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

2日間perfmonを実行して(SQL ServerマスターBrent Ozarが提案しているように)、Webアプリのデータベースパフォーマンスの全体的な感触を取得したいと思います。


1
一部の人々は、SQLトレースの使用を提案しています-SQLトレースに注意し、prodサーバー上のすべてのアクティビティをトレースしないでください。
サム

回答:


26

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

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


DSNでTypePerf.exeを使用して、データをテーブルに直接挿入しています。それらには個別のデータベースがあります。何らかの形で影響しますか?
UdIt Solanki

14

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

サーバーのアクティビティの適切なベースラインを収集するために、Perfmonを1〜2日実行します。監視対象のSQL Serverにそれほど侵襲的ではありません。詳細な結果が得られます。データが多いほど、Perfmonの結果を分析する上でより良い仕事ができます。

悪影響なしで、多くの運用Exchangeボックスでperfmonを実行しました。


5
合意-Perfmonの実行によるオーバーヘッドはありません。別の答えは、Perfmonの代わりにProfilerを実行することを提案しましたが、Profilerの実行には非常に大きなオーバーヘッドがあります。プロファイラトレースは、トレースボックスが負荷に対応できなかった場合、または追加された負荷が運用サーバーをエッジ上にプッシュした場合に、運用サーバーを停止するのを見てきました。
ブレントオザー

@Brentでチャイムをありがとう。ところで、私は昨日あなたの2008年の内部本を買いました。
ビルペッツケ

ああ、かっこいい!あなたがそれについてどう思うか教えてください。
ブレントオザー

7

PALをPerfmon Logsを分析するためのユーティリティとしてポッドキャストで書いたClint Huffmanを一度聞いたときから。運用アプリケーションサーバーのすべてで、フライトレコーダーと呼ばれるものをセットアップしました。このプラクティスは、問題の診断と傾向の監視に非常に役立ちました。

以下は、ログパージを使用して自動起動Perfmon Collectorをセットアップするために使用するスクリプトです。必要に応じて、パフォーマンスカウンターをリストするファイル(1行に1つ)または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コレクターと、2つのスケジュールされたタスクを作成します。1つのタスクは、再起動後にPerfMonコレクターを開始します。もう1つのタスクは、古いログファイルをクリーンアップします。PerfMonファイルをPALで分析する場合は、PALをセットアップし、非実稼働サーバーで実行することをお勧めします。セットアップを簡単にするために、PAL構成ファイルを読み取ります。
ネイサンハートリー

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

そのバージョンはまだ最新だと思います。
グレッグアスキュー

2

実稼働サーバーが開発サーバーの動作を正確にミラーリングし、開発サーバーの正確な複製でもある理想的な世界では、結果は開発サーバーの結果と同じになるため、実稼働サーバーでperfmonが必要になることはありません。もちろん、その神話的な状況は決して起こらないので、実稼働サーバーでperfmonを実行する必要がありますが、これにはまったく問題はありません。とりわけ、実稼働サーバーが開発サーバーと同じように動作しない理由を知るために、perfmonおよびその他のツールを使用する必要がある場合があります。


2

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

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

http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/は良いスタートです。本番用に使用されるほぼすべてのSQLサーバーで動作するはずのIMHO。


1

多くの人が示唆しているようにPerfmonを実行しても何も問題はありませんが、代わりにまたはそれに加えて、同じ警告でProfilerを実行します。あまり頻繁にキャプチャせず、単に実行時間の長いクエリをキャプチャします。 、または読み取り値> xxxx; 影響はほとんどありません。チューニングから最も恩恵を受けるクエリがすぐにわかります。


duration、cpu、readsの基本しきい値として何を使用しますか?
ビルペッツケ

アプリによって異なりますが、開始時間は>(ユーザーが何かを待つ最大時間)で開始します。高すぎて、10秒以上開始します。何も得られない場合は、少し下げてください。上部に「浮く」いくつかの驚きがあることを保証します。
SqlACID

..そして、私は持続時間から始めます、あなたがCPUバウンドであると思う場合のみCPUを使用し、I / Oバウンドである場合は読み取りまたは書き込みカウンタを使用しますが、ボトルネックがどこにあるのかわからない場合は持続時間を使用します、あなたが言ったように、何が起こっているのかを把握しようとしています。
SqlACID
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.