Sobre contadores de desempenho

Os Contadores de Desempenho do Windows fornecem uma camada de abstração de alto nível com uma interface consistente para coletar vários tipos de dados do sistema, como estatísticas de uso de processador, memória e disco. Os administradores do sistema usam contadores de desempenho para monitorar problemas de desempenho ou comportamento. Os desenvolvedores de software usam contadores de desempenho para inspecionar o uso de recursos de seus componentes.

Importante

Os Contadores de Desempenho do Windows são otimizados para descoberta e coleta de dados administrativos/de diagnóstico. Eles não são apropriados para coleta de dados de alta frequência ou para criação de perfil de aplicativo, pois não foram projetados para serem coletados mais de uma vez por segundo. Para obter acesso de sobrecarga mais baixa às informações do sistema, você pode preferir as APIs mais diretas, como o Auxiliar de Status do Processo,, GlobalMemoryStatusEx, GetSystemTimes pu GetProcessTimes. Para criação de perfil, é possível coletar logs ETW com dados de criação de perfil do sistema usando tracelog.exe com as opções -critsec, -dpcisr, -eflag ou -ProfileSource, ou usar a Criação de Perfil de Contador de Hardware.

Observação

Não confunda contadores de desempenho do Windows com a API QueryPerformanceCounter. Os Contadores de Desempenho do Windows fornecem uma abstração de alto nível para muitos tipos de informações do sistema. A função QueryPerformanceCounter fornece acesso otimizado a um carimbo de data/hora de alta precisão.

Introdução

Conceitos

O sistema do Contador de Desempenho do Windows é organizado em consumidores, provedores, conjunto de contadores, contadores, instâncias e valores de contador.

Um consumidor é um componente de software que usa dados de desempenho. O Windows inclui várias ferramentas internas que usam dados de desempenho. Isso inclui o Gerenciador de Tarefas, o Monitor de Recursos, o Monitor de Desempenho, o typeperf.exe, o logman.exe e o relog.exe. Os desenvolvedores podem escrever scripts e aplicativos que acessam contadores de desempenho por meio de APIs de contador de desempenho.

Um provedor é um componente de software que gera e publica dados de desempenho. Um provedor publicará dados para um ou mais contadores. Por exemplo, um sistema de banco de dados pode se registrar como um provedor de dados de desempenho.

  • Um provedor V1 é um componente de software que publica dados de desempenho por meio de uma DLL de desempenho executada no processo do consumidor. Um provedor V1 é instalado em um sistema por meio de um arquivo .ini. A arquitetura do provedor V1 foi preterida. Novos provedores devem usar a arquitetura do provedor V2.
  • Um provedor V2 é um componente de software que publica dados de desempenho por meio das APIs do provedor de contador de desempenho. Um provedor V2 é instalado em um sistema por meio de um arquivo .man (manifesto XML).

Um conjunto de contadores é um agrupamento de dados de desempenho em um provedor. Um conjunto de contadores tem um nome e um ou mais contadores. Coletar os dados de um conjunto de contadores retorna várias instâncias. Em algumas APIs do Windows, os conjuntos de contadores são chamados de objetos de desempenho. Por exemplo, um provedor de dados de desempenho para um sistema de banco de dados pode fornecer um conjunto de contadores para estatísticas por banco de dados.

Um contador é a definição de uma única parte dos dados de desempenho. Um contador tem um nome e um tipo. Por exemplo, um conjunto de contadores "estatísticas por banco de dados" pode conter um contador denominado "transações por segundo" com o tipo PERF_COUNTER_COUNTER.

Uma instância é uma entidade sobre quais dados de desempenho são relatados. Uma instância tem um nome (cadeia de caracteres) e um ou mais valores de contador. Por exemplo, um conjunto de contadores "estatísticas por banco de dados" pode conter uma instância por banco de dados. O nome da instância seria o nome do banco de dados e cada instância conteria valores de contador para contadores de "transações por segundo", "uso de memória" e "uso de disco".

Um valor de contador é o valor de uma única parte dos dados do contador de desempenho. Um valor de contador é um inteiro sem sinal, de 32 bits ou 64 bits, dependendo do tipo do contador correspondente. Ao falar sobre uma instância, às vezes, um valor de contador pode ser chamado de contador ou valor.

Dica

Pode ser útil relacionar os termos do contador de desempenho a termos de planilha mais familiares. Um conjunto de contadores é como uma tabela. Um contador é como uma coluna. Uma instância é como uma linha. Um valor de contador é como uma célula na tabela.

Os conjuntos de contadores de instância única sempre contêm dados para exatamente uma instância. Isso é comum para os conjuntos de contadores que relatam estatísticas globais do sistema. Por exemplo, o Windows tem um conjunto de contadores integrado de instância única denominado "Memória" que relata o uso global de memória.

Os conjuntos de contadores de várias instâncias contêm dados para um número variável de instâncias. Isso é comum aos conjuntos de contadores que relatam entidades dentro do sistema. Por exemplo, o Windows tem um conjunto de contadores integrado de várias instâncias denominado "Informações do Processador" que relata uma instância para cada CPU instalada.

Os consumidores coletarão e registrarão periodicamente os dados do conjunto de contadores de um provedor. Por exemplo, o consumidor pode coletar dados uma vez por segundo ou uma vez por minuto. Os dados coletados são chamados de exemplo. Um exemplo consiste em carimbos de data/hora junto com os dados para instâncias do contador. Os dados de cada instância incluem o nome da instância (cadeia de caracteres) e um conjunto de valores de contador (inteiros, um valor para cada contador no contador).

Os nomes de instância normalmente devem ser exclusivos em um exemplo, ou seja, um provedor não deve retornar duas instâncias com o mesmo nome que parte de um único exemplo. Alguns provedores mais antigos não seguem essa regra, portanto, os consumidores devem poder aceitar nomes de instância não exclusivos. Os nomes de instância não diferenciam maiúsculas de minúsculas, portanto, as instâncias não devem ter nomes que diferem apenas no caso.

Observação

Por motivos de compatibilidade com versões anteriores, o conjunto de contadores "Processo" retorna nomes de instância não exclusivos com base no nome do arquivo EXE. Isso pode causar resultados confusos, especialmente quando um processo com um nome não exclusivo é iniciado ou desligado, pois isso normalmente resultará em falhas de dados devido à correspondência incorreta de nomes de instância entre amostras. Os consumidores do conjunto de contadores "Processo" devem poder aceitar esses nomes de instância não exclusivos e as falhas de dados resultantes. No Windows 11 e posterior, use o conjunto de contadores Process V2 para evitar esse problema.

Os nomes de instância devem ser estáveis entre exemplos, ou seja, um provedor deve usar o mesmo nome de instância para a mesma entidade sempre que o conjunto de contadores for coletado.

Cada contador tem um tipo. O tipo de contador indica o tipo do valor bruto do contador (inteiro sem sinal de 32 bits ou inteiro sem sinal de 64 bits). O tipo de contador também indica o que o valor bruto do contador representa, que determina como o valor bruto deve ser processado para gerar estatísticas úteis.

Embora alguns tipos de contador sejam simples e tenham um valor bruto que seja diretamente útil, muitos tipos de contador exigem processamento adicional para criar um valor formatado útil. Para produzir o valor formatado, alguns tipos de contador exigem valores brutos de duas amostras, alguns tipos de contador exigem carimbos de data/hora e alguns tipos de contador exigem valores brutos de vários contadores. Por exemplo:

  • PERF_COUNTER_LARGE_RAWCOUNT é um valor bruto de 64 bits que não requer nenhum processamento para ser útil. É apropriado para valores pontuais, como "Bytes de memória em uso".
  • PERF_COUNTER_RAWCOUNT_HEX é um valor bruto de 32 bits que requer apenas a formatação hexadecimal simples para ser útil. É apropriado para informações pontuais ou de identificação, como "Sinalizadores" ou "Endereço Base".
  • PERF_COUNTER_BULK_COUNT é um valor bruto de 64 bits que indica uma contagem de eventos e é usado para calcular a taxa na qual os eventos ocorrem. Para ser útil, esse tipo de contador requer dois exemplos separados no tempo. O valor formatado é a taxa de eventos, ou seja, o número de vezes que o evento ocorreu por segundo durante o intervalo entre as duas amostras. Dado dois exemplos s0 e s1, o valor formatado (taxa de evento) seria computado como (s1.EventCount - s0.EventCount)/(s1.TimestampInSeconds - s0.TimestampInSeconds).

Espera-se que os provedores se comportem como se estivessem sem monitoração de estado, ou seja, coletar dados de um conjunto de contadores não deve afetar visivelmente o estado do provedor. Por exemplo, um provedor não deve redefinir valores de contador para 0 quando um conjunto de contadores é coletado e não deve usar o carimbo de data/hora de uma coleção anterior para ajustar os valores na coleção atual. Em vez disso, ele deve fornecer valores de contador brutos simples com tipos precisos para que o consumidor possa calcular estatísticas úteis com base nos valores brutos e em seus carimbos de data/hora.

Arquitetura da API de Desempenho

Performance counter applications invoke Windows APIs which call into providers to obtain performance data.

Os consumidores do contador de desempenho incluem:

A maioria dos consumidores do contador de desempenho usa as APIs do PDH.dll para coletar dados de desempenho. O PDH gerencia muitos aspectos complexos da coleta de contadores de desempenho, como análise de consultas, correspondência de instâncias em vários exemplos e computação de valores formatados dos dados brutos do contador. A implementação de PDH usa as APIs do Registro ao consumir dados de um provedor V1 e usa as APIs de consumidor V2 ao consumir dados de um provedor V2.

Alguns consumidores de contador de desempenho mais antigos usam as APIs do Registro para coletar dados de desempenho da chave especial HKEY_PERFORMANCE_DATA do Registro. Isso não é recomendado para um novo código porque o processamento dos dados do registro é complexo e propenso a erros. A implementação da API do Registro dá suporte diretamente à coleta de dados de provedores V1. Ela dá suporte indiretamente à coleta de dados de provedores V2 por meio de uma camada de tradução que usa as APIs de consumidor V2.

Alguns consumidores de contador de desempenho usam as funções do consumidor PerfLib V2 para acessar diretamente dados de provedores V2. Isso é mais complexo do que consumir dados usando as APIs PDH, mas essa abordagem pode ser útil se as APIs PDH não puderem ser usadas devido a preocupações de desempenho ou dependência. A implementação do PerfLib V2 dá suporte diretamente à coleta de dados de provedores V2. Ele não dá suporte à coleta de dados de provedores V1.

Observação

O Windows OneCore não inclui PDH.dll e não inclui suporte para o consumo de dados de contador de desempenho por meio das APIs do Registro. Os consumidores em execução no OneCore devem usar as funções do consumidor PerfLib V2.

Os provedores V1 são implementados como uma DLL de provedor que é carregada no processo do consumidor. A implementação da API do Registro gerencia o carregamento da DLL do provedor, chamando a DLL para coletar dados de desempenho e descarregando a DLL conforme apropriado. A DLL do provedor é responsável por coletar dados de desempenho conforme apropriado, por exemplo, usando as APIs normais do Windows, RPC, pipes nomeados, memória compartilhada ou outros mecanismos de comunicação entre processos.

Os provedores V2 são implementados como um programa de modo de usuário (geralmente um serviço do Windows) ou um driver no modo kernel. Normalmente, o código do provedor de dados de desempenho é integrado diretamente a um componente existente (ou seja, o driver ou serviço está relatando estatísticas sobre si mesmo). A implementação do PerfLib V2 gerencia solicitações e respostas por meio da extensão de kernel do PCW.sys, portanto, o provedor geralmente não precisa implementar nenhuma comunicação entre processos para fornecer os dados de desempenho.

Observação

As APIs e ferramentas do Contador de Desempenho do Windows incluem suporte limitado para acessar contadores de desempenho de outros computadores por meio do Registro Remoto (para provedores V1) e RPC (para provedores V2). Esse suporte geralmente é difícil de usar em termos de controles de autenticação (as ferramentas e as APIs só podem se autenticar como o usuário atual), bem como, em termos de configuração do sistema (os pontos de extremidade e os serviços necessários são desabilitados por padrão). Em muitos casos, é melhor acessar os contadores de desempenho de sistemas remotos por meio do WMI do que através do suporte interno de acesso remoto.

Público de desenvolvedores

Os contadores de desempenho geralmente são consumidos pelos administradores para identificar problemas de desempenho ou comportamento anormal de sistemas, por desenvolvedores para estudar o uso de recursos de componentes de software e por usuários individuais para entender como os programas estão se comportando em seu sistema. O uso pode ocorrer por meio de ferramentas de GUI, como Gerenciador de Tarefas ou Monitor de Desempenho, ferramentas de linha de comando como typeperf.exe ou logman.exe, por meio de scripts usando o WMI e PowerShell, ou por meio de APIs C/C++ e .NET.

Os provedores de contador de desempenho geralmente são implementados como drivers no modo kernel ou serviços de modo de usuário. Os provedores de contador de desempenho geralmente são gravados em C ou C++.

Requisitos de tempo de execução

Para obter informações sobre requisitos de tempo de execução para um determinado elemento de programação, consulte a seção Requisitos da página de referência desse elemento.

Para visualizar o histórico de versões, confira Novidades.

Confira também

Usando contadores de desempenho

Referência de contadores de desempenho