2009-07-30 16 views
17

Sto creando dei contatori di prestazioni personalizzati per un'applicazione. Ho scritto un semplice strumento C# per creare categorie e contatori. Ad esempio, lo snippet di codice riportato di seguito è fondamentalmente quello che sto eseguendo. Quindi, eseguo un'applicazione separata che aggiorna all'infinito il valore grezzo del contatore. Durante l'esecuzione, il contatore e l'istanza fittizia sono visualizzati localmente in perfmon.Perché non è possibile vedere le istanze del mio contatore delle prestazioni personalizzato?

Il problema che sto avendo è che il sistema di monitoraggio che usiamo non può vedere le istanze nel contatore multi-istanza Ho creato durante la visualizzazione in remoto da un altro server. Quando utilizzo perfmon per sfogliare i contatori, posso vedere la categoria e i contatori, ma la casella delle istanze è disattivata e non riesco nemmeno a selezionare "Tutte le istanze", né posso fare clic su "Aggiungi". L'utilizzo di altri metodi di accesso, come [typeperf][1], presenta problemi simili.

Non sono sicuro se si tratta di un problema di server o di codice. Questo è riproducibile solo nell'ambiente di produzione in cui ne ho bisogno. Sul mio desktop e server di sviluppo, funziona alla grande. Sono un amministratore locale su tutti i server.

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

Poi, in un'applicazione separata, corro questo per generare manichino dati di istanza:

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

Quale versione di .Net è questo? –

+0

È passato un po 'di tempo, ma sono sicuro che stavo usando .NET 2.0 o 3.5 al momento. – spoulson

+0

Hai mai avuto questa risposta? Mi chiedo se hai creato una classe Performance Counter personalizzata e non è stata serializzabile? –

risposta

1

(scarabocchi precedente testo out) Penso che l'accesso remoto è il problema (provate sul computer reale). In caso contrario, trovare un modo per collegare qualcos'altro ad esso sul computer di prova (contatore delle prestazioni semplice di base su una finestra con un display). Modifica anche il valore grezzo sull'app fittizia per testare.

+0

forse permessi o qualcosa del genere? – rogerdpack

0

Prova a registrarti i contatori sul sistema remoto, cioè .:

lodctr /M:manifest.man

Se questo non funziona, potrebbe essere un problema di autorizzazioni.

5

Il vostro programma di capita di essere un programma in esecuzione a 32 bit su Windows 2008 R2 o in un altro sistema operativo Windows a 64 bit? In tal caso, si consiglia di verificare che il servizio "Host contatore DLL delle prestazioni" sia in esecuzione. Questo servizio consente ai processi a 64 bit e remoti di interrogare i contatori forniti da processi a 32 bit.

1

E 'stato un po' che ho guardato a questo, ma si potrebbe voler provare a chiamare NextValue prima di impostare il valore e vedere se funziona. Non spiegherebbe perché funziona su alcune macchine ma non su altre.

Un'altra cosa divertente da guardare è ciò che sta effettivamente accadendo nel nome dell'istanza. Assicurati che nessun personaggio riservato entri lì altrimenti accadono tutti i tipi di brutte cose.

Potreste essere in grado di avere un'idea se si tratta di un problema di denominazione dal giro un'altra applicazione che legge in realtà il contatore. Se riesci a leggerlo con successo e perfmon non lo è, vuol dire che hai un nome formattato in modo da impedire a PerfMon di interpretarlo correttamente.

0

Questo potrebbe essere un problema di firewall.

Sul computer remoto (quello che ospita l'applicazione multi-istanza contatore delle prestazioni), assicurarsi che il software firewall consente le connessioni in entrata:

  • In Windows Firewall, sui computer di classe workstation, i "registri di prestazioni e avvisi "deve essere abilitata l'eccezione.
  • In Windows Firewall con protezione avanzata, su computer di classe server, è necessario abilitare le regole in entrata "Registri e avvisi di prestazioni (DCOM-In)" e "Registri di prestazioni e avvisi (TCP-In)".

Ecco un esempio # console operativa C per voi per verificare che hai il firewall configurato correttamente ...

// 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(); 
     } 
    } 
} 
Problemi correlati