26 septiembre 2009

Contadores de Rendimiento (Performance Counters) en aplicaciones .NET

Recupero un documento que tenía por ahí, guardado desde el (año) 2004 y que tiene validez hoy día, aunque las versiones de .NET hayan cambiado. Espero saquéis lo mejor de él, porque la verdad es que me da pereza retocar el código, pero el concepto tiene tanta validez hoy como ayer. Ahí os va.

Los contadores de rendimiento permiten a un administrador de sistema o al desarrollador de una aplicación controlar el rendimiento de un proceso, revisando la información que el proceso reporta explícitamente al sistema.

Así como hay contadores para memoria, CPU, caché, etc., cada aplicación puede configurar sus propios contadores, que permanecerán activos mientras exista una instancia del contador.

Para revisar los contadores existentes, utilice la herramienta de Windows Perfmon.exe (Monitor de Rendimiento / Performance Monitor), a la que también se puede acceder desde el icono Rendimiento, en las Herramientas Administrativas del Panel de Control.



Una vez abierto, seguimos los siguientes pasos:

  • Seleccionar “Monitor del sistema”, en la pestaña Árbol, del panel izquierdo
  • Clic secundario en el panel derecho y agregamos un contador.
  • Seleccionamos el equipo y el objeto de rendimiento del que vamos a seleccionar los contadores (puede ser uno de nuestros objetos personalizados)
  • Seleccionamos luego el contador y la instancia a monitorizar
  • Clic en el [Agregar] y luego en [Cerrar]


Una vez agregado el contador, estaremos al tanto de lo que se reporta acerca del proceso en cuestión mediante las gráficas del monitor de rendimiento.

Estos son los pasos a seguir para que nuestra aplicación disponga de contadores de rendimiento a través de los cuales informar de la situación de determinados procesos:

  • Abrimos nuestra aplicación .NET
  • En el explorador de servidores, abrimos el nodo del ordenador en el que se desea crear el contador.
  • En el árbol seleccionamos los contadores de rendimiento.
  • Con el clic derecho agregamos una nueva categoría.
  • Escribimos nombre y descripción para la categoría, que es lo que veremos como “objeto de rendimiento” al agregar un contador en el monitor del sistema (perfmon).
  • Podemos agregar varios contadores para un mismo objeto de rendimiento.
  • Agregamos un contador y su descripción
  • Clic en [New] y en [OK]


Los contadores adicionados son de sólo lectura por defecto, a menos que se especifique lo contrario.

Teniendo en cuenta que el contador podrá ser monitorizado siempre que exista una instancia de él, decidiremos dónde instanciarlo.

En este ejemplo agregamos un contador de rendimiento a un Servicio Web y para tener sólo un contador para todas las sesiones del Servicio Web, lo instanciaremos al crear la aplicación (en el Global.asax) y guardaremos la instancia del contador en el objeto Application.

En el constructor del Servicio Web, incrementaremos el contador, en el método “Dispose”, lo decrementaremos. Esto nos permitirá determinar cuántas instancias del Servicio Web se utilizan de forma simultánea.


Código C# Global.asax


protected void Application_Start(Object sender, EventArgs e)
{
System.Diagnostics.PerformanceCounter perf;
// creamos el performance counter
// ******************************
perf = new System.Diagnostics.PerformanceCounter(
"PruebaServicioWeb", "InstanciasActivas",
"Servicio Web: PruebaServicioWeb", false);
Application.Add("perf", perf);
}

Código C# en el Servicio Web:

public Service1()
{
InitializeComponent();
// incrementamos el performance counter
// ************************************
System.Diagnostics.PerformanceCounter perf;
perf = (System.Diagnostics.PerformanceCounter)Application["perf"]; perf.IncrementBy(1);
}

protected override void Dispose( bool disposing )
{
if(disposing && components != null) { components.Dispose(); } base.Dispose(disposing);
// decrementamos el performance counter
// *************************************
System.Diagnostics.PerformanceCounter perf;
perf = (System.Diagnostics.PerformanceCounter)Application["perf"];
perf.Decrement();
Application.Lock();
Application["perf"] = perf;
Application.UnLock();
}

Ya sabemos cómo monitorizarlo, ¿no? Lo encontraremos en el monitor del sistema (perfmon). ¿Lo veis?

Otro ejemplo de uso de los contadores de rendimiento lo da Rodrigo Corral en su blog, para revisar por qué tardan los mensajes en ser enviados a través de la cola de mensajería de Windows (MSMQ).

Espero os haya servido esto que he sacado del baúl de los recuerdos.


No hay comentarios: