Merhaba, bu makalemde Custom Performance Counters (Özel Performans Sayaçları) nedir ve nasıl yazılır konularını anlatacağım. İşin “Custom” tarafına geçmeden önce de Performance Counters’tan yani Performans Sayaçları’ndan kısaca bahsedeceğim.
Performance Counters Nedir?
Performans Sayaçları, adından da belli olacağı üzere sistemin performansına yönelik verileri izleyen sayaçlardır. Örneğin, sistemdeki boş bellek miktarı, kullanılan işlemci miktarı, diske yazma hızı vs. Herhangi bir Windows makinede, ön tanımlı olarak gelen onlarca kategoride binlerce performans sayacı mevcuttur. Bu sayaçları izleyerek sistem darboğazlarını tespit etmek mümkündür. Windows çalıştır kutusuna “perfmon” yazarak erişebileceğiniz Windows Performance Monitor aracıyla, mevcut tüm performans sayaçlarını anlık olarak ve grafiksel arayüz ile izleyebilirsiniz.
Performans sayaçlarına C# kodu ile de erişmek mümkündür. Dolayısıyla C# ile (daha doğrusu .Net ile) yazdığınız programlarda ihtiyaç halinde bu sayaçları kullanabilirsiniz. Örneğin uygulamanızda beklenmedik bir hata fırlatıldığında o anki sistem durumunu bu sayaçlardan öğrenip loglara yazabilirsiniz. Detaylı bilgi için System.Diagnostics kütüphanesi altında yer alan PerformanceCounter sınıfını inceleyebilirsiniz.
Custom Performance Counters Nedir?
Yukarıda da belirttiğim gibi Windows’da ön tanımlı olarak gelen binlerce performans sayacı mevcut; ancak bazı durumlarda kendi sayacınızı oluşturmak ve bunu Performance Monitor üzerinden grafiksel olarak izleme ihtiyacınız olabilir. Örneğin bir e-ticaret sitesinde, oluşturulan sipariş adedini gösteren, sipariş tutarları toplamını gösteren veya sipariş tutarlarının ortalamasını gösteren özel performans sayaçları yazılabilir. Diğer yandan mevcut performans sayaçlarını okuyup yorumladıktan sonra yeni bir metrik üreterek de özel performans sayacı oluşturulabilir. Örneğin, işlemci kullanımının bellek kullanımına oranı gibi.
Custom Performance Counters Nasıl Yazılır?
Yazacağınız programı çalıştırabilmek için Admin yetkisi gerekeceğinden Visual Studio’yu Admin yetkileriyle açmanız gerekiyor. Özel performans sayaçları oluşturabilmek için öncelikle PerformanceCounterCategory sınıfı yardımıyla bir kategori oluşturmanız gerekiyor; ancak kategoriyi program her çalıştığında tekrar tekrar oluşturmamak adına (zaten eğer kategori varsa hata fırlatılıyor) öncesinde “var mı” kontrolü yapmak gerekiyor. Eğer kategori henüz oluşturulmamışsa önce kategorinin sayaçları oluşturmalı sonra da bu sayaçları kullanarak kategoriyi oluşturmalısınız. Daha sonra da PerformanceCounter sınıfı yardımıyla bu oluşturduğunuz sayaçlara veri yazmalısınız. Özetle tüm akış bu şekilde.
Şimdi, öncelikle aşağıdaki şekilde sayaç ve kategori oluşturuyoruz:
string categoryName = "Sales";
if (!PerformanceCounterCategory.Exists(categoryName))
{
string counterName = "Total sales";
string counterHelp = "Total sales of all branches";
string categoryHelp = "Sales statistics";
PerformanceCounterCategory customCategory = new PerformanceCounterCategory(categoryName);
CounterCreationData counterCreationData = new CounterCreationData(counterName, counterHelp, PerformanceCounterType.NumberOfItems32);
CounterCreationDataCollection collection = new CounterCreationDataCollection();
collection.Add(counterCreationData);
PerformanceCounterCategory.Create(categoryName, categoryHelp, collection);
}
Daha sonra uygulamanın herhangi bir yerinde aşağıdaki şekilde sayacı arttırıyoruz:
string categoryName = "Sales";
string counterName = "Total sales";
PerformanceCounter counter = new PerformanceCounter(categoryName, counterName);
counter.ReadOnly = false;
// Sayaçların ilk değeri genelde 0'dır.
// Sayacı farklı bir değerden başlatmak için RawValue özelliği kullanılabilir.
counter.RawValue = 1;
// Sayacı 1 artırmak için Increment metodu çağrılır.
counter.Increment();
// Sayacı birden farklı bir değerde artırmak için IncrementBy metodu kullanılır.
// Eğer sayaç azaltılmak isteniyorsa da bu metod kullanılır ve eksi değer geçilir.
counter.IncrementBy(5);
Kendi oluşturduğunuz bir kategoriyi ve sayaçlarını silmek içinse aşağıdaki kodu kullanabilirsiniz:
PerformanceCounterCategory.Delete("Sales");
Sayacı arttırmak için edindiğimiz objenin oluşturulması performans açısından maliyetli bir işlemdir. Dolayısıyla devamlı yeni obje oluşturmak yerine mümkünse bir defa oluşturulan obje tekrar tekrar kullanılmalıdır. Custom Performance Counters hakkında detaylı bilgi ve örnekler için aşağıdaki linkleri inceleyebilirsiniz:
- https://dotnetcodr.com/2014/11/18/creating-a-new-performance-counter-on-windows-with-c-net/
- http://www.blackwasp.co.uk/CreatePerformanceCounters.aspx
- https://warewolf.io/blog/implementing-custom-windows-performance-counters-in-c/
- https://www.codeproject.com/Articles/8590/An-Introduction-To-Performance-Counters
- https://www.coderslexicon.com/using-performance-counters-in-the-c-language/