Bir .NET uygulamasında performanstan bahsederken ilk konuşulması gereken şey, uygulamanın hafıza kullanım miktarıdır. .NET uygulamalarında - ve özellikle de ASP.NET uygulamalarında da - yanlış hafıza yönetimi ve/veya kullanımı performansı direkt olarak olumsuz etkileyecektir.
.NET uygulamalarında hafıza yönetimi işini (yani nesneler için hafızada yer ayrılması ve sonra temizlenmesi) Garbage Collector (GC) mekanizması yapar. GC'nin faklı çalışma şekilleri vardır. Normalde hangi modun kullanılacağına CLR otomatik olarak karar verir. ASP.NET uygulamaları genellikle çok CPU'lu makinelerinde çalışacağından, "server GC" kullanırlar. Bunun anlamı, en basit şekliyle, şudur:
Uygulama çalışmaya başladığında mantıksal (logical) CPU sayısı kadar "thread", GC'ye ayrılır. Bu thread'ler GC dışında bir iş yapmazlar. GC devreye girmeye karar verdiğinde aktif tüm istekler, tüm işler askıya alınır ve bu thread'ler hafızadaki nesneleri taramaya ve temizlemeye başlarlar. Bu iş boyunca yeni gelen istekler de kuyruğa düşerler. Yani uygulamamız tamamen durur.
Sırf bu tanıma bakarak bile şu sonucu çıkarabiliriz: GC ne kadar seyrek devreye girerse ve devreye girdiğinde ne kadar kısa süre çalışırsa, uygulamanın genel performansına olumsuz etkisi o kadar az olacaktır. Ancak asıl sorun da tam olarak burada karşımıza çıkıyor: Bunu nasıl sağlayacağız?
.NET uygulamalarında, manuel olarak tetiklemek dışında GC'ye müdahale edemiyoruz. Manuel tetiklemenizi de, çok istisnai senaryolar dışında - kesinlikle önermiyoruz. GC sayısını azaltmanın ve kısa sürmesini sağlamanın tek yolu, uygulamanın genel hafıza kullanımını düşürmektir. Ancak bu, özellikle de ASP.NET uygulamalarında çok da kolay bir iş değildir.
Tüm bunlara ve daha fazlasına, uygulamanızın yapısına ve ihtiyaçlarına göre sizin karar vermeniz gerekmektedir.
Performance monitor
Aşağıdaki performans sayaçları hem hafıza kullanımımız hakkında fikir verecektir, hem de GC'nin genel performansımıza etkisini gösterecektir (tüm sayaçlar ".NET CLR Memory" altındadır):
Kaynaklar
Garbage Collection: Automatic Memory Management in the Microsoft .NET Frameworkhttp://msdn.microsoft.com/en-us/magazine/bb985010.aspx
Automatic Memory Managementhttp://msdn.microsoft.com/en-us/library/f144e03t.aspx
<gcServer> Elementhttp://msdn.microsoft.com/en-us/library/ms229357.aspx
<gcConcurrent> Elementhttp://msdn.microsoft.com/en-us/library/yhwwzef8.aspx