还是应该将perfmon限于具有模拟生产活动的负载测试的Dev / QA服务器?
我想运行perfmon两天(如Sql Server管理员Brent Ozar所建议的那样),以便对我的Web应用程序的数据库性能有一个总体了解。
还是应该将perfmon限于具有模拟生产活动的负载测试的Dev / QA服务器?
我想运行perfmon两天(如Sql Server管理员Brent Ozar所建议的那样),以便对我的Web应用程序的数据库性能有一个总体了解。
Answers:
无论是否有侦听器,SQL Server以及大多数其他产品都会始终生成计数器(忽略-x启动选项)。计数器跟踪在被监视的应用程序上是完全透明的。有一个共享内存区域,受监视的应用程序将在该共享内存上进行写入,并且监视会话将以指定的时间间隔读取原始值。因此,与监视相关的唯一成本是监视过程的成本以及将采样值写入磁盘的成本。选择适当的收集间隔(我通常选择15秒)和适中的计数器数量(50-100),并写入二进制文件格式通常不会对受监视的系统产生影响。
但是我建议不要使用Perfmon(如perfmon.exe)。而是让自己熟悉logman.exe,请参阅Logman.exe,Relog.exe和Typeperf.exe工具的说明。这样,您就不会将收集会话绑定到会话。Logman是一种命令行工具,可以在脚本和计划的作业中使用以启动和停止收集会话。
在生产机器上运行perfmon并没有错。它的键相对较低,可以为您收集很多有用的信息。如果不在生产服务器上进行某些分析,您将如何准确地模拟生产负载?在您自己的链接中来自Brent Ozar:
让Perfmon运行一两天,以收集服务器活动的良好基准。不受监视的SQL Server的侵入性很大,深入的结果将有所收获。我们拥有的数据越多,我们在分析Perfmon结果方面可以做得越好。
我已经在许多生产Exchange机器上运行了perfmon,并且没有任何不利影响。
自从我听了Clint Huffman的声音后,他曾在播客上为PAL编写了一种用于分析Perfmon Logs的实用程序。我已经在所有生产应用程序服务器上设置了所谓的Flight Recorder。这种做法对于诊断问题和监视趋势非常有用。
下面是我用来设置自动启动Perfmon Collector(带有日志清除)的脚本。如果需要,可以向其馈送一个列出性能计数器以供收集的文件(每行一个)或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
为什么要表现?我的意思是,最新版本的SQL Server具有自己的方法,包括建立性能计数器的(中央)数据仓库,然后可以查询和报告该性能计数器。在那里运行perfmon的意义是零。
与往常一样,我对这里的所有帖子都感到惊讶,这些人显然从未读过文档;)
http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/是一个好的开始。恕我直言,应该在几乎所有用于生产目的的sql服务器上工作。
正如许多人所建议的那样,运行Perfmon没什么问题,但是我还是要运行Profiler,或者,同样要注意,不要捕获太多,只捕获长时间运行的查询,即持续时间> x秒,或者cpu> xx ,或读取> xxxx; 影响很小,您将很快看到从调整中受益最大的查询。