2010-06-07 10 views
10

La mayoría de los contadores de rendimiento de instancias múltiples en Windows parecen tener automáticamente (?) Un #n al final si hay más de una instancia con el mismo nombre.Nombrar contadores de rendimiento de varias instancias en .NET

Por ejemplo: si en Monitor de rendimiento, nos fijamos en la categoría Process, podrás ver:

... 
dwm 
explorer 
explorer#1 
... 

Tengo dos explorer.exe procesos, por lo que el segundo contador tiene # 1 anexa a su nombre.

cuando intento hacer esto en una aplicación .NET:

  • puedo crear la categoría, y registrar la instancia (utilizando el PerformanceCounterCategory.Create que toma un CounterCreationDataCollection).
  • Puedo abrir el contador para escribir y escribir en él.

Cuando abro el contador por segunda vez (en otro proceso), abre el mismo contador. Esto significa que tengo dos procesos peleando por los contadores.

El documentation for PerformanceCounter.InstanceName indica que # no está permitido en el nombre.

Entonces, ¿cómo tengo contadores de rendimiento de varias instancias que son en realidad múltiples instancias? ¿Y dónde la segunda instancia (y subsecuente) obtiene #n adjuntado al nombre?

Es decir: sé que puedo poner el ID del proceso (por ejemplo) en el nombre de la instancia. Esto funciona, pero tiene el desafortunado efecto secundario de que al reiniciar el proceso se genera un nuevo PID, y Perfmon continúa supervisando el contador anterior.

Actualización:

estoy creando la categoría (y contra) de la siguiente manera:

const string categoryName = "Test App"; 
const string counterName = "Number of kittens"; 
string instanceName = 
    Path.GetFileNameWithoutExtension(
     Process.GetCurrentProcess().MainModule.FileName); 

if (!PerformanceCounterCategory.Exists(categoryName)) 
{ 
    var counterCreationDataCollection = new CounterCreationDataCollection 
     { 
      new CounterCreationData(counterName, "", 
       PerformanceCounterType.NumberOfItems32) 
     }; 

    PerformanceCounterCategory.Create(categoryName, "", 
     PerformanceCounterCategoryType.MultiInstance, 
     counterCreationDataCollection); 
} 

Estoy abriendo el contador de la siguiente manera:

PerformanceCounter counter = new PerformanceCounter(
     categoryName, counterName, instanceName, readOnly: false); 
+0

Cuando abre su contador de rendimiento por segunda vez, ¿lo está haciendo en un proceso diferente, o desde un componente diferente en el mismo proceso? – JMarsch

+0

Proceso diferente. –

+0

Creo que debe abrirlos con diferentes nombres de instancia. De lo contrario, terminará escribiendo en el contador equivocado. Además, consulte http://msdn.microsoft.com/en-us/library/dd537616.aspx, que parece sugerir que perfmon agrega el "n.º 1". – feroze

Respuesta

2

pienso su problema es con el hecho de que .NET es más flexible en cuanto a los contadores de rendimiento, y en realidad está pasando por alto la API de Gan de PerfLib.

Al usar la API PerfLib nativa, registra categorías durante la instalación y crea instancias del proceso utilizando identificadores. Por lo tanto, con la API nativa no hay una forma directa de compartir una instancia de contador. Por lo tanto, cuando se accede a dos instancias de contador con el mismo nombre, en realidad tienen diferentes identificadores y están marcados con # apropiadamente.

En .NET, ya que simplemente direcciona un contador y una instancia por su nombre, corre el riesgo de recibir actualizaciones cruzadas. Como .NET toma el nombre y enumera (utilizando el WMI) las instancias, incluso si están siendo utilizadas por una aplicación diferente.

Creo que agregar el PID * es sin duda la solución más inteligente, ya que ambos tienen una mejor capacidad de seguimiento y ninguna colisión. Respecto al problema con el reinicio creando un nuevo contador, no veo el problema; Si permite que se ejecute más de una instancia del proceso en un momento dado, ¿cómo sabría si esta instancia se creó debido a un reinicio o simplemente ejecutando otro ejecutable?

Si tiene una dependencia de algún tipo entre los procesos, puede limpiar los contadores obsoletos o utilizar alguna otra lógica. Mientras está en PerfMon puede ver "*" todas las instancias.

* O si tiene alguna lógica detrás del proceso, que se mantiene sin tener en cuenta los reinicios, como una identificación de tarea de algún tipo.

Cuestiones relacionadas