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:
Oczywiście standardowo mamy do dyspozycji wykres i inne narzędzia PerfMon:
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); }
Hmmm… W czytniku RSS mam dwa wpisy obok siebie: Twój i Ayende pod tytułem “Performance counters sucks” (http://ayende.com/blog/165217/performance-counters-sucks). Ech… 🙂
@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.