2009-06-15 13 views
1

Je suis en train de créer un compteur de performance personnalisé en C# sur la base par minute.Performance personnalisée Compteur/minute dans .NET

Jusqu'à présent, j'ai vu que RateOfCountsPerSecond32 ou RateOfCountsPerSecond64 disponibles.

Quelqu'un sait quelles sont les options pour créer un compteur personnalisé basé sur par minute?

+0

Actuellement, nous utilisons le type CounterDelta32 pour le compteur et le PerfMon les données et contrôlant toutes les minutes. Cette approche semble fonctionner correctement pour nous. –

Répondre

2

Ce ne sera pas pris en charge directement. Vous devrez vous-même calculer le taux par minute, puis utiliser un compteur NumberOfItems32 ou NumberOfItems64 pour afficher le taux. L'utilisation d'un nom utile comme "Compte/minute" permettra de clarifier la valeur. Vous allez juste mettre à jour le compteur chaque minute. Un fil de fond (travailleur) serait un bon endroit pour le faire.

Alternativement, vous pouvez tout dépend du logiciel de surveillance. Utilisez un compteur NumberOfItems32/64, mais demandez au logiciel de surveillance de faire le calcul par minute. L'outil PerfMon intégré à Windows ne le fait pas, mais il n'y a aucune raison pour qu'il ne le puisse pas.

1

Par défaut PerfMon extrait les données chaque seconde. Afin d'obtenir une image permanente dans le graphique du moniteur de performance Windows, j'ai écrit un compteur personnalisé pour mesurer le taux de comptage par minute. Après avoir travaillé pendant une minute, je reçois des données de mon compteur. Notez que la précision n'a pas d'importance pour moi.

Extrait de code ressembler à ceci:

class PerMinExample 
{ 
    private static PerformanceCounter _pcPerSec; 
    private static PerformanceCounter _pcPerMin; 
    private static Timer _timer = new Timer(CallBack, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)); 
    private static Queue<CounterSample> _queue = new Queue<CounterSample>(); 

    static PerMinExample() 
    { 
     // RateOfCountsPerSecond32 
     _pcPerSec = new PerformanceCounter("Category", "ORDERS PER SECOND", false); 

     // NumberOfItems32 
     _pcPerMin = new PerformanceCounter("Category", "ORDERS PER MINUTE", false); 
     _pcPerSec.RawValue = 0; 
     _pcPerMin.RawValue = 0; 
    } 

    public void CountSomething() 
    { 
     _pcPerSec.Increment(); 
    } 

    private static void CallBack(Object o) 
    { 
     CounterSample sample = _pcPerSec.NextSample(); 

     _queue.Enqueue(sample); 
     if (_queue.Count <= 60) 
      return; 

     CounterSample prev = _queue.Dequeue(); 

     Single numerator = (Single)sample.RawValue - (Single)prev.RawValue; 
     Single denomenator = 
      (Single)(sample.TimeStamp - prev.TimeStamp) 
      /(Single)(sample.SystemFrequency)/60; 
     Single counterValue = numerator/denomenator; 

     _pcPerMin.RawValue = (Int32)Math.Ceiling(counterValue); 

     Console.WriteLine("ORDERS PER SEC: {0}", _pcPerSec.NextValue()); 
     Console.WriteLine("ORDERS PER MINUTE: {0}", _pcPerMin.NextValue()); 
    } 
} 
+0

Bonne réponse, mon seul commentaire est que définir 'RawValue' à 0 dans le constructeur pourrait causer un problème si vous instanciez plusieurs instances de la classe comme je le fais à la réception d'une requête web. – MikeW