在生产服务器上运行perfmon可以吗?又为什么呢?


28

还是应该将perfmon限于具有模拟生产活动的负载测试的Dev / QA服务器?

我想运行perfmon两天(如Sql Server管理员Brent Ozar所建议的那样),以便对我的Web应用程序的数据库性能有一个总体了解。


1
有人建议使用SQL跟踪-谨慎使用SQL跟踪,不要跟踪产品服务器上的所有活动。
山姆

Answers:


26

无论是否有侦听器,SQL Server以及大多数其他产品都会始终生成计数器(忽略-x启动选项)。计数器跟踪在被监视的应用程序上是完全透明的。有一个共享内存区域,受监视的应用程序将在该共享内存上进行写入,并且监视会话将以指定的时间间隔读取原始值。因此,与监视相关的唯一成本是监视过程的成本以及将采样值写入磁盘的成本。选择适当的收集间隔(我通常选择15秒)和适中的计数器数量(50-100),并写入二进制文件格式通常不会对受监视的系统产生影响。

但是我建议不要使用Perfmon(如perfmon.exe)。而是让自己熟悉logman.exe,请参阅Logman.exe,Relog.exe和Typeperf.exe工具的说明。这样,您就不会将收集会话绑定到会话。Logman是一种命令行工具,可以在脚本和计划的作业中使用以启动和停止收集会话。


我正在将TypePerf.exe与DSN一起使用,以将数据直接插入表中。他们有一个单独的数据库。会以任何方式影响吗?
UdIt Solanki

14

在生产机器上运行perfmon并没有错。它的键相对较低,可以为您收集很多有用的信息。如果不在生产服务器上进行某些分析,您将如何准确地模拟生产负载?在您自己的链接中来自Brent Ozar:

让Perfmon运行一两天,以收集服务器活动的良好基准。不受监视的SQL Server的侵入性很大,深入的结果将有所收获。我们拥有的数据越多,我们在分析Perfmon结果方面可以做得越好。

我已经在许多生产Exchange机器上运行了perfmon,并且没有任何不利影响。


5
同意-运行Perfmon没有任何开销。另一个答案是建议运行Profiler而不是Perfmon,但是运行Profiler会产生非常实际的开销。我已经看到,当跟踪框无法跟上负载时,或者当添加的负载将生产服务器推到边缘时,Profiler跟踪会关闭生产服务器。
布伦特·奥扎尔

感谢您在@Brent中鸣叫。顺便说一句,我昨天买了你的2008年内部书籍
Bill Paetzke,2010年

啊,酷!告诉我你对它的想法。
布伦特·奥扎尔

7

自从我听了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

此脚本是否需要安装任何东西(PAL或其他)?能否请您提供它生成的输出文件的样本?抱歉,我不知道PowerShell。
CodingYoshi

没有要安装的内容。该脚本配置本机Windows功能。它创建一个PerMon收集器,以及两个计划的任务。一个任务,在重新启动后启动PerfMon收集器。另一个任务是清理旧的日志文件。如果您想使用PAL分析您的PerfMon文件,我建议您设置PAL并在非生产服务器上运行。为便于设置,这将读取一个PAL配置文件。
内森·哈特利

3

我们经常这样做。这对于在实际环境中建立基准也很重要,因此,如果有问题或需要进行容量研究,您可以稍后进行比较。

我建议不要低于10秒间隔。如果您要收集许多对象/计数器,并且间隔太频繁,则可能会影响操作。

Microsoft有一个PerfMon向导,它将为您设置任务。

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


我看到性能监视器向导是在2004年。我不知道发布,如果它与SQL Server 2005标配
比尔Paetzke

我认为该版本仍然是最新的。
格雷格·阿斯克

2

在一个理想的环境中,生产服务器可以准确地反映开发服务器的功能,并且也是开发服务器的精确副本,生产服务器上永远不需要Perfmon,因为结果与开发服务器上的结果相同。当然,这种神话般的情况永远不会发生,因此我们确实需要在生产服务器上运行perfmon,这绝对没有错。除其他外,我们可能需要使用perfmon和其他工具来了解为何生产服务器与开发服务器的行为不相同。


2

为什么要表现?我的意思是,最新版本的SQL Server具有自己的方法,包括建立性能计数器的(中央)数据仓库,然后可以查询和报告该性能计数器。在那里运行perfmon的意义是零。

与往常一样,我对这里的所有帖子都感到惊讶,这些人显然从未读过文档;)

http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/是一个好的开始。恕我直言,应该在几乎所有用于生产目的的sql服务器上工作。


1

正如许多人所建议的那样,运行Perfmon没什么问题,但是我还是要运行Profiler,或者,同样要注意,不要捕获太多,只捕获长时间运行的查询,即持续时间> x秒,或者cpu> xx ,或读取> xxxx; 影响很小,您将很快看到从调整中受益最大的查询。


您将持续时间,cpu和读取的基本阈值用作什么?
Bill Paetzke,2010年

这取决于应用程序,但是我将以duration>(最长时间,我希望任何用户等待任何东西)开始;开始时过高,持续10秒或更长时间,如果您什么都没得到,那就把它退下来一点。保证您将有一些惊喜“浮空”到顶部。
SqlACID 2010年

..并且我从持续时间开始,如果您认为自己受CPU限制,则仅使用CPU;如果您受I / O限制,则仅使用读取或写入计数器;如果不确定瓶颈所在,则仅使用持续时间;或者,就像您说的那样,试图了解正在发生的事情。
SqlACID 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.