2009-07-30 12 views
17

Estoy creando algunos contadores de rendimiento personalizados para una aplicación. Escribí una herramienta simple de C# para crear las categorías y los contadores. Por ejemplo, el fragmento de código siguiente es básicamente lo que estoy ejecutando. Luego, ejecuto una aplicación independiente que refresca sin fin el valor bruto del contador. Mientras se ejecuta, el contador y la instancia ficticia se ven localmente en perfmon.¿Por qué no puede Perfmon ver instancias de mi contador de rendimiento personalizado?

El problema que tengo es que el sistema de monitorización que usamos no puede ver las instancias en el contador de varias instancias que he creado al visualizar de forma remota desde otro servidor. Cuando uso perfmon para explorar los contadores, puedo ver la categoría y los contadores, pero el cuadro de instancias está en gris y ni siquiera 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 genial. 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, corro esto para generar datos de ejemplo ficticio:

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

¿Qué versión de .Net es esto? –

+0

Ha pasado un tiempo, pero estoy bastante seguro de que estaba usando .NET 2.0 o 3.5 en ese momento. – spoulson

+0

¿Alguna vez le respondieron esto? Me pregunto si creaste una clase de contador de rendimiento personalizada y no fue serializable. –

Respuesta

1

(garabatos texto anterior fuera) Creo acceso remoto es el problema (prueba en el equipo real) De lo contrario, encuentre la forma de conectarle otra cosa en la computadora de prueba (contador básico de rendimiento simple en una ventana con una pantalla). También edita el valor bruto en la aplicación ficticia para probar.

+0

¿tal vez permisos o algo? – rogerdpack

0

Intenta registrar los contadores en el sistema remoto, es decir .:

lodctr /M:manifest.man

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

5

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

1

Ha pasado un tiempo desde que miré esto, pero puede intentar llamar a NextValue antes de establecer el valor y ver si funciona. Sin embargo, no explicaría por qué funciona en algunas máquinas, pero no en otras.

Otra cosa divertida de ver es lo que realmente está pasando en el nombre de su instancia. Asegúrate de que no entren personajes reservados, de lo contrario suceden todo tipo de cosas malas.

Es posible que se haga una idea si se trata de un problema de nombres al girar otra aplicación que realmente lee el contador. Si puede leerlo con éxito y perfmon no puede hacerlo, significa que tiene un nombre formateado de manera que impide que PerfMon lo interprete correctamente.

0

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

En el equipo remoto (el que aloja la aplicación de múltiples instancias de contador de rendimiento), asegurarse de que el software de cortafuegos permite las conexiones entrantes:

  • En Firewall de Windows, en los equipos para estaciones de trabajo, los "registros de rendimiento y Alertas "la excepción debe estar habilitada.
  • En Windows Firewall con seguridad avanzada, en equipos 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í está un ejemplo de trabajo # consola de C para que pueda comprobar que usted tiene el cortafuegos 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 StackOverflow."; 
     private const string counterName = "Instance Counter"; 
     private const string counterHelp = "Instanced counter demonstration for StackOverflow."; 

     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(); 
     } 
    } 
} 
Cuestiones relacionadas