还是应该将perfmon限制在一个Dev / QA服务器上,并进行模拟生产活动的负载testing?
我想运行perfmon两天( 如Sql Server主Brent Ozarbuild议 ),以获得我的Web应用程序的数据库性能的整体感觉。
SQL Server和大多数其他产品,无论是否有侦听器,都会始终生成计数器(忽略-x启动选项)。 计数器跟踪对被监视的应用程序是完全透明的。 有一个共享内存区域,受监视的应用程序将在其中进行写入,并且监视会话将以指定的时间间隔读取原始值。 因此,与监视相关的唯一成本是监视过程的成本以及将采样值写入磁盘的成本。 select一个体面的收集间隔(我通常select15秒)和中等数量的计数器(50-100),写入二进制文件格式通常不会影响监视系统。
但我build议不要使用Perfmon(如在perfmon.exe中)。 相反,请熟悉logman.exe,请参阅Logman.exe,Relog.exe和Typeperf.exe工具的说明 。 这样您就不会将收集会话与您的会话联系起来。 作为命令行工具的Logman可用于脚本和计划作业中,以启动和停止收集会话。
在生产箱上运行perfmon没有任何问题。 这是相对低调,可以为你收集很多好的信息。 如果你没有在生产服务器上运行一些分析,你将如何准确地模拟生产负载? 从布伦特·奥扎尔在你自己的链接:
让Perfmon运行一两天来收集服务器活动的良好基线。 这并不是对被监控的SQL Server的入侵,深入的结果将会得到回报。 我们掌握的数据越多,分析Perfmon结果的工作就越好。
我在许多生产交换箱上运行perfmon,没有不良影响。
自从我听了克林特·霍夫曼 ( Clint Huffman) ,他曾经在播客上写过一个PAL分析Perfmon Logs的工具。 我已经在我们所有的生产应用服务器上设置了我所谓的飞行logging器。 这种做法已经非常方便地用于诊断问题和监测趋势。
以下是我用来设置自动启动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
我们经常这样做。 在真实环境中build立基线也是必不可less的,所以如果出现问题或需要进行能力研究,您可以稍后进行比较。
尽pipe如此,我build议不要低于10秒。 如果您正在收集许多对象/计数器,并且间隔过于频繁,则可能会影响操作。
Microsoft有一个PerfMon向导,将为您设置任务。
在理想的情况下,生产服务器与开发服务器完全相同,并且也是开发服务器的完全重复,因此生产服务器上永远不需要使用perfmon,因为结果将与开发服务器上的相同。 当然,神话的情况从来没有发生,所以我们需要在生产服务器上运行perfmon,这绝对没有错。 除此之外,我们可能需要使用perfmon和其他工具来了解为什么生产服务器的行为与dev服务器不一样。
为什么perfmon? 我的意思是,SQL服务器的最新版本有自己的方法,包括构build性能计数器的(中央)数据仓库,然后可以查询和报告。 在那里运行perfmon没有任何意义。
与往常一样,我对这些显然从未阅读过文档的人感到惊讶;)
http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/是一个好的开始。 恕我直言,应该在几乎所有用于生产目的的SQL服务器上工作。
运行Perfmon没有什么问题,但是我会运行Profiler,或者另外运行Profiler,注意事项不要太频繁,只需要捕获长时间运行的查询,即持续时间> x秒,或者cpu> xx ,或者读取> xxxx; 影响非常小,而且您将很快看到将从调优中获益最多的查询。