2010-06-07 15 views
10

La maggior parte dei contatori delle prestazioni di istanze multiple in Windows sembrano automaticamente (?) Avere un n al fine se c'è più di un'istanza con lo stesso nome.Denominazione dei contatori delle prestazioni a più istanze in .NET

Per esempio: se, in Perfmon, si guarda sotto la categoria Process, vedrete:

... 
dwm 
explorer 
explorer#1 
... 

Ho due explorer.exe processi, in modo che il secondo contatore ha # 1 aggiunto al suo nome.

Quando tento di fare questo in un'applicazione .NET:

  • posso creare la categoria, e registrare l'istanza (utilizzando il PerformanceCounterCategory.Create che prende un CounterCreationDataCollection).
  • Posso aprire il contatore per scrivere e scrivere su di esso.

Quando apro il contatore una seconda volta (in un altro processo), apre lo stesso contatore. Ciò significa che ho due processi in lotta per i contatori.

Il documentation for PerformanceCounter.InstanceName indica che # non è consentito nel nome.

Quindi: come si ottengono contatori di prestazioni a istanze multiple che sono in realtà più istanze? E dove le seconde (e successive) istanze ottengono #n aggiunte al nome?

Ovvero: so che posso inserire l'ID del processo (ad es.) Sul nome dell'istanza. Funziona, ma ha lo sfortunato effetto collaterale che il riavvio del processo genera un nuovo PID e Perfmon continua a monitorare il vecchio contatore.

Aggiornamento:

Sto creando la categoria (e contro) come segue:

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); 
} 

sto aprendo il contatore come segue:

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

Quando si apre il contatore delle prestazioni per la seconda volta, lo stai facendo in un processo diverso o da un altro componente nello stesso processo? – JMarsch

+0

Processo diverso. –

+0

Penso che devi aprirli con nomi di istanze differenti. Altrimenti finirai per scrivere sul contatore sbagliato. Inoltre, vedere http://msdn.microsoft.com/en-us/library/dd537616.aspx che sembra suggerire che il "# 1" sia stato aggiunto da perfmon. – feroze

risposta

2

penso il tuo problema è con il fatto che .NET è più sciolto rispetto ai contatori delle prestazioni, ed è in realtà bypassando l'API PerfLib Win.

Quando si utilizza l'API native PerfLib, si registra categorie durante l'installazione - e creare istanze del processo utilizzando le maniglie. Pertanto, con l'API nativa non esiste un modo semplice per condividere un'istanza del contatore. Così, quando due istanze contatore si accede con lo stesso nome, in realtà hanno le maniglie differenti e sono contrassegnati da # in modo appropriato.

In .NET come un semplice contatore e un'istanza per nome, si corre il rischio di aggiornamenti incrociati. Come .NET prende il nome e enumera (usando il WMI) le istanze anche se vengono utilizzate da un'altra applicazione.

Penso che aggiungere il PID * sia davvero la soluzione più intelligente, poiché entrambi hanno una migliore capacità di tracciamento e nessuna collisione. Per quanto riguarda il problema con il riavvio della creazione di un nuovo contatore, non riesco a vedere il problema; se si consente l'esecuzione di più di un'istanza del processo in un dato momento, come sapresti se questa istanza è stata creata a causa di un riavvio o semplicemente eseguendo un altro eseguibile?

Se si ha una dipendenza di qualche tipo tra i processi, è possibile ripulire i contatori obsoleti o impiegare qualche altra logica. Mentre in PerfMon puoi guardare "*" tutte le istanze.

* Oppure se si dispone di una logica dietro il processo, che viene mantenuta indipendentemente da riavvii, ad esempio un ID attività di qualche tipo.

Problemi correlati