Performance Counters – API

Dzisiaj kilka przykładów pokazujących jak operować licznikami z poziomu c#. Czytanie jakichkolwiek liczników jest bardzo proste ponieważ .NET Framework dostarcza odpowiednie klasy:

var performanceCounter = new PerformanceCounter("Processor", "% Processor Time","_Total");
while (true)
{
 Console.WriteLine(performanceCounter.NextValue());
 Thread.Sleep(5000);
}

Konstruktor po prostu przyjmuje jako parametry nazwę kategorii, licznika oraz instancji – w tym przypadku chcemy badać całkowite zużycie procesora, a nie w odniesieniu do konkretnego procesu.

Możliwe jest również odczytanie wszystkich kategorii i liczników:

foreach (PerformanceCounterCategory category in PerformanceCounterCategory.GetCategories())
{
 Console.WriteLine(category.CategoryName);

 foreach (PerformanceCounter counter in category.GetCounters())
     Console.WriteLine("\t{0}",counter.CounterName);
}

Można stworzyć własny licznik, dostosowany do danego systemu. Taki scenariusz jest dość częsty dla większych aplikacji. Ułatwia to administratorom znacząco zadanie w przypadku jakiś problemów. Liczniki stanowią doskonały element instrumentacji naszego systemu. Możemy w nich przechowywać jakiekolwiek wartości. Stworzenie takiego licznika jest intuicyjne, a mianowicie:

private static void SetupCounters()
{
  if (!PerformanceCounterCategory.Exists("CustomTestCategory"))
  {
      CounterCreationDataCollection counterDataCollection = new CounterCreationDataCollection();

      CounterCreationData counter = new CounterCreationData();
      counter.CounterType = PerformanceCounterType.NumberOfItems64;
      counter.CounterName = "CustomTestCounter";
      counterDataCollection.Add(counter);

      PerformanceCounterCategory.Create("CustomTestCategory","Any description",PerformanceCounterCategoryType.SingleInstance, counterDataCollection);

  }
}

Następnie można otworzyć licznik w trybie do zapisu i modyfikować RawValue:

SetupCounters();
var counter = new PerformanceCounter("CustomTestCategory", "CustomTestCounter",readOnly:false);
Random random=new Random();
while (true)
{
    counter.RawValue = random.Next();
    Thread.Sleep(3000);
}

Po odpaleniu powyższego kodu, w Performance Monitor zobaczymy, że licznik faktycznie został dodany:

image

Oczywiście standardowo mamy do dyspozycji wykres i inne narzędzia PerfMon:

image

Jako ciekawostkę dodam, że do wyświetlenia zużycia CPU (pierwszy przykład), łatwiej użyć po prostu właściwości TotalProcessorTime:

while (true)
{
    Console.WriteLine(Process.GetCurrentProcess().TotalProcessorTime);
    Thread.Sleep(3000);
}

2 thoughts on “Performance Counters – API”

  1. @Dario:
    Ayende z pewnoscia ma więcej doświaczenia w tworzeniu własnych liczników niż ja.
    Jeśli chodzi o konsumowanie tego co liczniki tworzą nie miałem żadnych problemów z tym. Widać, problemy zaczynają się, jak chce sie tworzyc wlasne liczniki.

Leave a Reply

Your email address will not be published.