Acerca de los contadores de rendimiento

Los contadores de rendimiento de Windows proporcionan una capa de abstracción de alto nivel con una interfaz coherente para recopilar varios tipos de datos del sistema, como el procesador, la memoria y las estadísticas de uso de disco. Los administradores del sistema usan contadores de rendimiento para supervisar los problemas de rendimiento o comportamiento. Los desarrolladores de software usan contadores de rendimiento para inspeccionar el uso de recursos de sus componentes.

Importante

Los contadores de rendimiento de Windows están optimizados para la detección y recopilación de datos administrativos o de diagnóstico. No son adecuados para la recopilación de datos de alta frecuencia o para la creación de perfiles de aplicaciones, ya que no están diseñados para recopilarse más de una vez por segundo. Para obtener acceso de menor sobrecarga a la información del sistema, es posible que prefiera API más directas, como asistente de estado de proceso, GlobalMemoryStatusEx,GetSystemTimes o GetProcessTimes. Para crear perfiles puede recopilar registros ETW con datos de creación de perfiles del sistema mediante las opciones tracelog.exe con opciones -critsec, -dpcisr, -eflag o -ProfileSource, o bien puede usar la creación de perfiles de contadores de hardware.

Nota:

No confunda contadores de rendimiento de Windows con la API QueryPerformanceCounter. Los contadores de rendimiento de Windows proporcionan una abstracción de alto nivel para muchos tipos de información del sistema. La función QueryPerformanceCounter proporciona acceso optimizado a una marca de tiempo de alta precisión.

Introducción

Conceptos

El sistema de contador de rendimiento de Windows se organiza en consumidores, proveedores, conjunto de contadores, contadores, instancias y valores de contador.

Un consumidor es un componente de software que usa datos de rendimiento. Windows incluye varias herramientas integradas que hacen uso de datos de rendimiento. Estos incluyen el administrador de tareas, el monitor de recursos, el monitor de rendimiento, typeperf.exe, logman.exe y relog.exe. Los desarrolladores pueden escribir scripts y aplicaciones que acceden a los contadores de rendimiento a través de las API de contadores de rendimiento.

Un proveedor es un componente de software que genera y publica datos de rendimiento. Un proveedor publicará datos para uno o varios conjuntos de contadores. Por ejemplo, un sistema de base de datos podría registrarse como proveedor de datos de rendimiento.

  • Un proveedor V1 es un componente de software que publica datos de rendimiento a través de un archivo DLL de rendimiento que se ejecuta en el proceso del consumidor. Un proveedor V1 se instala en un sistema a través de un archivo .ini. La arquitectura del proveedor V1 está en desuso. Los nuevos proveedores deben usar la arquitectura del proveedor V2.
  • Un proveedor V2 es un componente de software que publica datos de rendimiento a través de las API del proveedor de contadores de rendimiento. Un proveedor V2 se instala en un sistema a través de un .man archivo (manifiesto XML).

Un conjunto de contadores es una agrupación de datos de rendimiento dentro de un proveedor. Un conjunto de contadores tiene un nombre y uno o varios contadores. La recopilación de los datos de un conjunto de contadores devuelve una serie de instancias. En algunas API de Windows, los conjuntos de contadores se denominan objetos de rendimiento. Por ejemplo, un proveedor de datos de rendimiento para un sistema de base de datos podría proporcionar un conjunto de contadores para las estadísticas por base de datos.

Un contador es la definición de un solo fragmento de datos de rendimiento. Un contador tiene un nombre y un tipo. Por ejemplo, un conjunto de contadores de "estadísticas por base de datos" podría contener un contador denominado "transacciones por segundo" con el tipo PERF_COUNTER_COUNTER.

Una instancia es una entidad sobre qué datos de rendimiento se notifican. Una instancia tiene un nombre (cadena) y uno o varios valores de contador. Por ejemplo, un conjunto de contadores de "estadísticas por base de datos" podría contener una instancia por base de datos. El nombre de instancia sería el nombre de la base de datos y cada instancia contendrá valores de contador para los contadores "transacciones por segundo", "uso de memoria" y "uso de disco".

Un valor de contador es el valor de una sola parte de los datos del contador de rendimiento. Un valor de contador es un entero sin signo, de 32 o de 64 bits en función del tipo del contador correspondiente. Cuando se habla de una instancia, un valor de contador puede llamarse a veces un contador o un valor.

Sugerencia

Puede resultar útil relacionar los términos del contador de rendimiento con términos de hoja de cálculo más conocidos. Un conjunto de contadores es como una tabla. Un contador es como una columna. Una instancia es como una fila. Un valor de contador es como una celda de la tabla.

Los conjuntos de contadores de instancia única siempre contienen datos para una instancia exactamente. Esto es común para los conjuntos de contadores que notifican estadísticas globales del sistema. Por ejemplo, Windows tiene un conjunto de contadores de instancia única integrado denominado "Memoria" que informa sobre el uso de memoria global.

Los conjuntos de contadores de instancias múltiples contienen datos para un número variable de instancias. Esto es común para los conjuntos de contadores que informan sobre las entidades dentro del sistema. Por ejemplo, Windows tiene un conjunto de contadores de varias instancias integrado denominado "Información del procesador" que informa de una instancia para cada CPU instalada.

Los consumidores recopilarán y registrarán periódicamente los datos del conjunto de contadores de un proveedor. Por ejemplo, el consumidor podría recopilar datos una vez por segundo o una vez por minuto. Los datos recopilados se denominan ejemplo. Un ejemplo consta de marcas de tiempo junto con los datos de las instancias del conjunto de contadores. Los datos de cada instancia incluyen el nombre de instancia (cadena) y un conjunto de valores de contador (enteros, un valor para cada contador del conjunto de contadores).

Los nombres de instancia normalmente deben ser únicos en un ejemplo, es decir, un proveedor no debe devolver dos instancias con el mismo nombre que parte de una sola muestra. Algunos proveedores más antiguos no siguen esta regla, por lo que los consumidores deben ser capaces de tolerar nombres de instancia no únicos. Los nombres de instancia no distinguen mayúsculas de minúsculas, por lo que las instancias no deben tener nombres que solo difieren en eso.

Nota:

Por motivos de compatibilidad con versiones anteriores, el conjunto de contadores "Procesar" devuelve nombres de instancia no únicos basados en el nombre de archivo EXE. Esto puede provocar resultados confusos, especialmente cuando un proceso con un nombre no único se inicia o se cierra, ya que normalmente provocará problemas de datos debido a una coincidencia incorrecta de nombres de instancia entre muestras. Los consumidores del conjunto de contadores "Proceso" deben ser capaces de tolerar estos nombres de instancia no únicos y los errores de datos resultantes. En Windows 11 y versiones posteriores, puedes usar el conjunto de contadores Process V2 para evitar este problema.

Los nombres de instancia deben ser estables entre ejemplos, es decir, un proveedor debe usar el mismo nombre de instancia para la misma entidad cada vez que se recopila el conjunto de contadores.

Cada contador tiene un tipo. El tipo de contador indica el tipo del valor sin formato del contador (entero de 32 bits sin signo o entero de 64 bits sin signo). El tipo de contador también indica lo que representa el valor sin formato del contador, que determina cómo se debe procesar el valor sin formato para generar estadísticas útiles.

Aunque algunos tipos de contadores son simples y tienen un valor sin formato que es directamente útil, muchos tipos de contadores requieren un procesamiento adicional para crear un valor con formato útil. Para generar el valor con formato, algunos tipos de contadores requieren valores sin formato de dos ejemplos, algunos tipos de contadores requieren marcas de tiempo y algunos tipos de contadores requieren valores sin formato de varios contadores. Por ejemplo:

  • PERF_COUNTER_LARGE_RAWCOUNT es un valor sin formato de 64 bits que no requiere que el procesamiento sea útil. Es adecuado para los valores a un momento dado, como "Bytes de memoria en uso".
  • PERF_COUNTER_RAWCOUNT_HEX es un valor sin formato de 32 bits que solo requiere que el formato hexadecimal simple sea útil. Es adecuado para un momento dado o para identificar información como "Marcas" o "Dirección base".
  • PERF_COUNTER_BULK_COUNT es un valor sin formato de 64 bits que indica un recuento de eventos y se usa para calcular la velocidad a la que se producen los eventos. Para ser útil, este tipo de contador requiere dos ejemplos separados en el tiempo. El valor con formato es la tasa de eventos, es decir, el número de veces que se produjo el evento por segundo durante el intervalo entre los dos ejemplos. Dados dos ejemplos s0 y s1, el valor con formato (tasa de eventos) se calcularía como (s1.EventCount - s0.EventCount)/(s1.TimestampInSeconds - s0.TimestampInSeconds).

Se espera que los proveedores se comporten como si no tuvieran estado, es decir, la recopilación de datos de un conjunto de contadores no debería afectar visiblemente al estado del proveedor. Por ejemplo, un proveedor no debe restablecer los valores de contador a 0 cuando se recopila un conjunto de contadores y no debe usar la marca de tiempo de una colección anterior para ajustar los valores de la colección actual. En su lugar, debe proporcionar valores de contador sin formato simples con tipos precisos para que el consumidor pueda calcular estadísticas útiles basadas en los valores sin procesar y sus marcas de tiempo.

Arquitectura de la API de rendimiento

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

Los consumidores de contadores de rendimiento incluyen:

La mayoría de los consumidores de contadores de rendimiento usan API de PDH.dll para recopilar datos de rendimiento. PDH administra muchos aspectos complejos de la recopilación de contadores de rendimiento, como el análisis de consultas, la búsqueda de coincidencias de instancias en varios ejemplos y la computación de valores con formato de los datos de contador sin formato. La implementación de PDH usa las API del Registro al consumir datos de un proveedor V1 y usa las API de consumidor V2 al consumir datos de un proveedor V2.

Algunos consumidores de contadores de rendimiento más antiguos usan las API del Registro para recopilar datos de rendimiento de la clave especial HKEY_PERFORMANCE_DATA del Registro. Esto no se recomienda para el nuevo código porque el procesamiento de los datos del registro es complejo y propenso a errores. La implementación de la API del Registro admite directamente la recopilación de datos de proveedores V1. Admite indirectamente la recopilación de datos de proveedores V2 a través de una capa de traducción que usa las API de consumidor V2.

Algunos consumidores de contadores de rendimiento usan las funciones de consumidor de PerfLib V2 para acceder directamente a los datos de los proveedores V2. Esto es más complejo que consumir datos mediante las API de PDH, pero este enfoque puede ser útil si las API de PDH no se pueden usar debido a problemas de rendimiento o dependencia. La implementación de PerfLib V2 admite directamente la recopilación de datos de proveedores V2. No admite la recopilación de datos de proveedores V1.

Nota:

Windows OneCore no incluye PDH.dll y no incluye compatibilidad con el consumo de datos de contadores de rendimiento a través de las API del Registro. Los consumidores que se ejecutan en OneCore deben usar las funciones de consumidor de PerfLib V2.

Los proveedores V1 se implementan como un archivo DLL de proveedor que se carga en el proceso de consumidor. La implementación de la API del Registro administra la carga del archivo DLL del proveedor, la llamada a la DLL para recopilar datos de rendimiento y descargar el archivo DLL según corresponda. El archivo DLL del proveedor es responsable de recopilar datos de rendimiento según corresponda, por ejemplo, mediante API normales de Windows, RPC, canalizaciones con nombre, memoria compartida u otros mecanismos de comunicación entre procesos.

Los proveedores V2 se implementan como un programa en modo de usuario (a menudo un servicio de Windows) o un controlador en modo kernel. Normalmente, el código del proveedor de datos de rendimiento se integra directamente en un componente existente (es decir, el controlador o el servicio notifica estadísticas sobre sí mismo). La implementación de PerfLib V2 administra las solicitudes y respuestas a través de la extensión del kernel PCW.sys, por lo que el proveedor normalmente no necesita implementar ninguna comunicación entre procesos para proporcionar los datos de rendimiento.

Nota:

Las API y las herramientas del contador de rendimiento de Windows incluyen compatibilidad limitada para acceder a contadores de rendimiento desde otras máquinas a través del Registro remoto (para proveedores V1) y RPC (para proveedores V2). Esta compatibilidad suele ser difícil de usar en términos de controles de autenticación (las herramientas y las API solo se pueden autenticar como el usuario actual), así como en términos de configuración del sistema (los puntos de conexión y servicios necesarios están deshabilitados de forma predeterminada). En muchos casos, es mejor acceder a los contadores de rendimiento de los sistemas remotos a través de WMI en lugar de a través de la compatibilidad integrada con el acceso remoto.

Audiencia de los desarrolladores

Los administradores suelen consumir contadores de rendimiento para identificar problemas de rendimiento o comportamientos anómalos de los sistemas: para que los desarrolladores estudien el uso de recursos de los componentes de software y para que los usuarios individuales comprendan cómo se comportan los programas en su sistema. El uso puede producirse a través de herramientas de GUI como el Administrador de tareas o Monitor de rendimiento, herramientas de línea de comandos como typeperf.exe o logman.exe, mediante scripting a través de WMI y PowerShell, o a través de las API de C/C++ y .NET.

Los proveedores de contadores de rendimiento normalmente se implementan como controladores en modo kernel o servicios en modo de usuario. Normalmente, los proveedores de contadores de rendimiento se escriben en C o C++.

Requisitos del tiempo de ejecución

Para obtener información sobre los requisitos en tiempo de ejecución de un elemento de programación determinado, vea la sección Requisitos de la página de referencia de ese elemento.

Para ver el historial de versiones, consulte Novedades.

Consulte también

Uso de contadores de rendimiento

Referencia de contadores de rendimiento