net .net perfmon

.net - net - ¿Por qué perfmon no puede ver las instancias de mi contador de rendimiento personalizado?



.net performancecounter (6)

Estoy creando algunos contadores de rendimiento personalizados para una aplicación. Escribí una sencilla herramienta de C # para crear las categorías y contadores. Por ejemplo, el fragmento de código a continuación es básicamente lo que estoy ejecutando. Luego, ejecuto una aplicación separada que actualiza continuamente el valor bruto del contador. Mientras se ejecuta, el contador y la instancia ficticia se ven localmente en perfmon.

El problema que tengo es que el sistema de monitoreo que utilizamos no puede ver las instancias en el contador de múltiples instancias que he creado al ver de forma remota desde otro servidor. Al usar perfmon para navegar por los contadores, puedo ver la categoría y los contadores, pero el cuadro de instancias aparece en gris y no puedo seleccionar "Todas las instancias", ni puedo hacer clic en "Agregar". El uso de otros métodos de acceso, como [typeperf][1] presenta problemas similares.

No estoy seguro si esto es un problema de servidor o código. Esto solo es reproducible en el entorno de producción donde lo necesito. En mi escritorio y servidores de desarrollo, funciona muy bien. Soy un administrador local en todos los servidores.

CounterCreationDataCollection collection = new CounterCreationDataCollection(); var category_name = "My Application"; var counter_name = "My counter name"; CounterCreationData ccd = new CounterCreationData(); ccd.CounterType = PerformanceCounterType.RateOfCountsPerSecond64; ccd.CounterName = counter_name; ccd.CounterHelp = counter_name; collection.Add(ccd); PerformanceCounterCategory.Create(category_name, category_name, PerformanceCounterCategoryType.MultiInstance, collection);

Luego, en una aplicación separada, ejecuto esto para generar datos de instancia ficticios:

var pc = new PerformanceCounter(category_name, counter_name, instance_name, false); while (true) { pc.RawValue = 0; Thread.Sleep(1000); }


¿Su programa es un programa de 32 bits que se ejecuta en Windows 2008 R2 u otro sistema operativo Windows de 64 bits? Si es así, es posible que desee comprobar que el servicio "Host de DLL de contador de rendimiento" se está ejecutando. Este servicio permite que los procesos remotos de 64 bits consulten contadores proporcionados por procesos de 32 bits.


(garabatea el texto anterior) Creo que el acceso remoto es el problema (pruebe en la computadora real). Si no es así, encuentre alguna forma de conectar otra cosa a la computadora de prueba (contador de rendimiento simple básico en una ventana con una pantalla). También edite el valor bruto en la aplicación ficticia para probar.


Esto también podría ser un problema de firewall.

En la computadora remota (la que aloja la aplicación de contador de rendimiento de múltiples instancias), asegúrese de que el software Firewall permita conexiones entrantes:

  • En el Firewall de Windows, en las computadoras de clase de estación de trabajo, la excepción "Registros y alertas de rendimiento" debe estar habilitada.
  • En Windows Firewall con seguridad avanzada, en las computadoras de clase de servidor, las reglas de entrada "Registros y alertas de rendimiento (DCOM-In)" y "Registros y alertas de rendimiento (TCP-In)" deben estar habilitadas.

Aquí hay un ejemplo de consola de C # en funcionamiento para que compruebe que tiene el firewall configurado correctamente ...

// Based on the MSDN-supplied C# example from: // Adding and Removing Performance Counter Instances // http://msdn.microsoft.com/en-us/library/8t39y5k1%28v=VS.71%29.aspx using System; using System.Diagnostics; using System.Threading; namespace CustomPerformanceCounters { class Program { private const string categoryName = "Instance Category"; private const string categoryHelp = "Instanced counter demonstration for ."; private const string counterName = "Instance Counter"; private const string counterHelp = "Instanced counter demonstration for ."; static void RegisterCounter() { if (!PerformanceCounterCategory.CounterExists(counterName, categoryName)) { PerformanceCounterCategory.Create( categoryName , categoryHelp , PerformanceCounterCategoryType.MultiInstance , counterName , counterHelp ); } } static void RunCounter() { const string instance1 = "instance1"; const string instance2 = "instance2"; const string instance3 = "instance3"; // Assumes category and counter have been created. PerformanceCounter myCounter = new PerformanceCounter( categoryName ,counterName , instance1 , false ); int currentValue = 0; int currentIncrement = 1; while (true) { currentValue += currentIncrement; if (currentValue > 99) { currentIncrement = -1; } else if (currentValue < 1) { currentIncrement = 1; } int instance1Value = currentValue; int instance2Value = 100 - currentValue; int instance3Value = Math.Abs(instance1Value - instance2Value); Console.WriteLine("Current values: {0}, {1}, {2}", instance1Value, instance2Value, instance3Value); myCounter.InstanceName = instance1; myCounter.RawValue = instance1Value; myCounter.InstanceName = instance2; myCounter.RawValue = instance2Value; myCounter.InstanceName = instance3; myCounter.RawValue = instance3Value; Thread.Sleep(1000); } } static void Main(string[] args) { RegisterCounter(); RunCounter(); } } }


Ha pasado un tiempo desde que lo he visto, pero es posible que desee intentar llamar a NextValue antes de establecer el valor y ver si funciona. No explicaría por qué funciona en algunas máquinas pero no en otras.

Otra cosa divertida que ver es lo que realmente está sucediendo en el nombre de su instancia. Asegúrate de que no haya caracteres reservados allí, de lo contrario suceden todo tipo de cosas malas.

Quizás puedas tener una idea si es un problema de nomenclatura girando otra aplicación que realmente lee el contador. Si puede leerlo con éxito y Perfmon no puede, significa que tiene un nombre formateado de una manera que evita que PerfMon lo interprete correctamente.


Intente registrar los contadores en el sistema remoto, es decir:

lodctr /M:manifest.man

Si eso no funciona, podría ser un problema de permisos.