Posso executar o perfmon em servidores de produção? E porque?


28

Ou a perfmon deve ser limitada a um servidor de desenvolvimento / controle de qualidade com testes de carga que simulam a atividade de produção?

Gostaria de executar o perfmon por dois dias ( como sugere o mestre do Sql Server, Brent Ozar ), para ter uma idéia geral do desempenho do banco de dados do meu aplicativo da web.


1
Algumas pessoas sugeriram o uso de um rastreamento de SQL - seja cauteloso com o rastreamento de SQL e nunca rastreie todas as atividades em um servidor de prod.
Sam

Respostas:


26

O SQL Server e a maioria dos outros produtos geram os contadores o tempo todo, independentemente de haver ouvintes ou não (ignorando a opção de inicialização -x). O rastreamento do contador é completamente transparente no aplicativo que está sendo monitorado. Há uma região de memória compartilhada na qual o aplicativo monitorado grava e a partir da qual as sessões de monitoramento leem os valores brutos no intervalo especificado. Portanto, o único custo associado ao monitoramento é o custo do processo de monitoramento e o custo para gravar os valores amostrados no disco. Escolher um intervalo de coleta decente (geralmente escolho 15 segundos) e um número moderado de contadores (50-100), e gravar em um formato de arquivo binário geralmente não deixa impacto no sistema monitorado.

Mas eu recomendaria não usar o Perfmon (como no perfmon.exe). Em vez disso, familiarize-se com o logman.exe, consulte Descrição das ferramentas Logman.exe, Relog.exe e Typeperf.exe . Dessa forma, você não vincula a sessão de coleta à sua sessão. O Logman, sendo uma ferramenta de linha de comando, pode ser usado em scripts e tarefas agendadas para iniciar e parar as sessões de coleta.


Estou usando o TypePerf.exe com DSN para inserir dados diretamente nas tabelas. Há um banco de dados separado para eles. Isso afetará de alguma forma?
udit Solanki

14

Não há nada errado em executar o perfmon nas caixas de produção. É uma chave relativamente baixa e pode reunir muitas informações boas para você. E como você simularia com precisão as cargas de produção se não executasse alguma análise no servidor de produção? Do Brent Ozar no seu próprio link:

Deixe o Perfmon executar por um dia ou dois para reunir uma boa linha de base da atividade do servidor. Não é tão invasivo no SQL Server sendo monitorado, e os resultados detalhados serão recompensados. Quanto mais dados tivermos, melhor o trabalho que podemos fazer na análise dos resultados do Perfmon.

Já executei perfmon em várias caixas de troca de produção sem efeitos adversos.


5
Concordo - não há sobrecarga na execução do Perfmon. Outra resposta sugeriu a execução do Profiler em vez do Perfmon, mas há uma sobrecarga muito real na execução do Profiler. Eu já vi rastreamentos do Profiler derrubar servidores de produção quando a caixa de rastreamento não conseguia acompanhar a carga ou quando a carga adicionada empurrou o servidor de produção para o limite.
Brent Ozar

Obrigado por comentar em @Brent. A propósito, eu comprei seu livro de 2008 de ontem ontem.
Bill Paetzke

Ah legal! Deixe-me saber o que você pensa disso.
Brent Ozar

7

Desde que ouvi Clint Huffman , que escreveu ao PAL um utilitário para analisar o Perfmon Logs, em um podcast uma vez. Eu configurei o que chamo de Flight Recorder em todos os nossos servidores de aplicativos de produção. Essa prática foi muito útil para diagnosticar problemas e monitorar tendências.

Abaixo está o script que eu uso para configurar um Perfmon Collector de inicialização automática, com limpeza de log. Se desejado, ele pode alimentar um arquivo listando contadores de desempenho para coletar (um por linha) ou um arquivo XML de limite PAL. Eu gosto de usar os arquivos 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

Esse script precisa de algo para ser instalado (PAL ou qualquer outra coisa)? Você pode fornecer uma amostra do arquivo de saída gerado, se possível? Desculpe, eu não conheço o PowerShell.
usar o seguinte código

Não há nada para instalar. Este script configura recursos nativos do Windows. Ele cria um coletor PerMon, além de duas tarefas agendadas. Uma tarefa, inicia o coletor PerfMon após uma reinicialização. A outra tarefa limpa os arquivos de log antigos. Se você deseja analisar seus arquivos PerfMon com PAL, recomendo que o PAL seja configurado e executado em um servidor que não seja de produção. Para facilitar a configuração, isso lerá um arquivo de configuração PAL.
Nathan Hartley

3

Fazemos isso com bastante frequência. Também é essencial para estabelecer uma linha de base no ambiente real, para que você possa comparar mais tarde se houver problemas ou precisar realizar um estudo de capacidade.

Eu recomendo não ficar abaixo de um intervalo de 10 segundos. Se você estiver coletando muitos objetos / contadores e o intervalo for muito frequente, isso poderá afetar as operações.

A Microsoft possui um Assistente PerfMon que configurará a tarefa para você.

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


Vejo que o Assistente PerfMon foi lançado em 2004. Eu me pergunto se ele vem com SQL Server 2005.
Bill Paetzke

Eu acho que essa versão ainda está atual.
Greg Askew

2

Em um mundo ideal em que um servidor de produção reflete exatamente o que um servidor de desenvolvimento, faz e também é uma duplicata exata do servidor de desenvolvimento, o perfmon nunca deve ser necessário no servidor de produção, porque os resultados serão os mesmos do servidor de desenvolvimento. É claro que essa situação mítica nunca acontece, por isso precisamos executar o perfmon em servidores de produção e não há absolutamente nada de errado nisso. Entre outras coisas, podemos precisar usar perfmon e outras ferramentas para descobrir por que o servidor de produção não está se comportando da mesma forma que o servidor de desenvolvimento.


2

Por que perfmon? Quero dizer, as versões recentes do SQL Server têm seu próprio método, incluindo a criação de um data warehouse (central) de contadores de desempenho que podem ser consultados e relatados. Não há sentido em executar perfmon lá.

Como sempre, fico impressionado com todos os posts aqui de pessoas que obviamente nunca leem a documentação;)

http://www.simple-talk.com/sql/learn-sql-server/sql-server-2008-performance-data-collector/ é um bom começo. IMHO que deve funcionar em quase todos os servidores sql usados ​​para fins de produção.


1

Nada de errado com a execução do Perfmon, como muitos sugeriram, mas eu executaria o Profiler em vez disso, com as mesmas advertências, não capturar com muita frequência, apenas capturar consultas de execução longa, como duração> x segundos ou cpu> xx ou lê> xxxx; muito pouco impacto, e você verá rapidamente as consultas que mais se beneficiariam com o ajuste.


what do you use as base thresholds of duration, cpu, and reads?
Bill Paetzke

Depende do aplicativo, mas eu começaria com a duração> (tempo máximo que eu gostaria que qualquer usuário esperasse por qualquer coisa); comece muito alto, 10 segundos ou mais, se você não conseguir nada, ótimo, diminua um pouco. Garantido que você terá algumas surpresas "flutuando" para o topo.
SqlACID

..e eu começaria com a duração, use apenas a CPU se você acha que está vinculado à CPU, leia ou escreva contadores se estiver vinculado à E / S, mas use a duração se não tiver certeza de onde estão os gargalos ou apenas , como você disse, tentando entender o que está acontecendo.
SqlACID
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.