または、perfmonは、実稼働アクティビティをシミュレートする負荷テストを備えたDev / QAサーバーに限定する必要がありますか?
2日間perfmonを実行して(SQL ServerマスターBrent Ozarが提案しているように)、Webアプリのデータベースパフォーマンスの全体的な感触を取得したいと思います。
または、perfmonは、実稼働アクティビティをシミュレートする負荷テストを備えたDev / QAサーバーに限定する必要がありますか?
2日間perfmonを実行して(SQL ServerマスターBrent Ozarが提案しているように)、Webアプリのデータベースパフォーマンスの全体的な感触を取得したいと思います。
回答:
SQL Serverおよび他のほとんどの製品は、リスナーが存在するかどうかに関係なく、常にカウンターを生成します(-x起動オプションを無視します)。カウンタートレースは、監視対象のアプリケーションに対して完全に透過的です。監視対象アプリケーションが書き込みを行い、監視セッションが指定された間隔で生の値を読み取る共有メモリ領域があります。したがって、監視に関連する唯一のコストは、監視プロセスのコストと、サンプリングされた値をディスクに書き込むコストです。適切な収集間隔(通常は15秒を選択)と適度な数のカウンター(50〜100)を選択し、バイナリファイル形式に書き込むことは、通常、監視対象システムに影響を与えません。
しかし、perfmon(perfmon.exeなど)の使用はお勧めしません。代わりに、logman.exeに慣れてください。Logman.exe、Relog.exe、およびTypeperf.exe Toolsの説明を参照してください。この方法では、収集セッションをセッションに結び付けません。コマンドラインツールであるLogmanは、収集セッションを開始および停止するスクリプトおよびスケジュールされたジョブで使用できます。
運用ボックスでperfmonを実行しても何も問題はありません。それは比較的低いキーであり、あなたのために多くの良い情報を集めることができます。また、運用サーバーで何らかの分析を実行しなかった場合、運用負荷を正確にシミュレートするにはどうすればよいでしょうか?あなた自身のリンクのブレント・オザールから:
サーバーのアクティビティの適切なベースラインを収集するために、Perfmonを1〜2日実行します。監視対象のSQL Serverにそれほど侵襲的ではありません。詳細な結果が得られます。データが多いほど、Perfmonの結果を分析する上でより良い仕事ができます。
悪影響なしで、多くの運用Exchangeボックスでperfmonを実行しました。
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
かなり頻繁に行います。また、実際の環境でベースラインを確立するためにも不可欠であるため、問題がある場合やキャパシティスタディを実行する必要がある場合は、後で比較できます。
ただし、10秒間隔未満にしないことをお勧めします。多数のオブジェクト/カウンターを収集していて、間隔が頻繁すぎる場合、操作に影響する可能性があります。
Microsoftには、タスクをセットアップするPerfMonウィザードがあります。
実稼働サーバーが開発サーバーの動作を正確にミラーリングし、開発サーバーの正確な複製でもある理想的な世界では、結果は開発サーバーの結果と同じになるため、実稼働サーバーでperfmonが必要になることはありません。もちろん、その神話的な状況は決して起こらないので、実稼働サーバーでperfmonを実行する必要がありますが、これにはまったく問題はありません。とりわけ、実稼働サーバーが開発サーバーと同じように動作しない理由を知るために、perfmonおよびその他のツールを使用する必要がある場合があります。
なぜperfmonですか?つまり、SQL Serverの最近のバージョンには、パフォーマンスカウンターの(中央の)データウェアハウスを構築し、クエリを実行して報告するなど、独自の方法があります。そこでperfmonを実行しても意味がありません。
私は、いつものように、明らかにドキュメントを読んだことがない人々のすべての投稿に驚いています;)
http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/は良いスタートです。本番用に使用されるほぼすべてのSQLサーバーで動作するはずのIMHO。
多くの人が示唆しているようにPerfmonを実行しても何も問題はありませんが、代わりにまたはそれに加えて、同じ警告でProfilerを実行します。あまり頻繁にキャプチャせず、単に実行時間の長いクエリをキャプチャします。 、または読み取り値> xxxx; 影響はほとんどありません。チューニングから最も恩恵を受けるクエリがすぐにわかります。