Hafıza kullanım limitleri

Bir işletim sistemi üzerinde çalışan herhangi bir “uygulama”nın (process) kullanabileceği hafıza miktarında, tahmin edebileceğiniz gibi bir limit bulunmaktadır. Bu limit, işletim sisteminden ziyade, işlemci mimarisiyle ilgilidir. Bundan kastım, işlemcinin 32bit mi 64bit mi olduğudur. İşlemci açısından bunun ne demek olduğu ve ne ifade ettiği bizim konumuz olmadığından burada bahsetmeyeceğim.

Artık 64bit işlemcilerin kullanımı oldukça artmış olsa da, halen pek çok kişisel bilgisayarda ve sunucuda 32bit işlemciler kullanılmaktadır. İşlemcinin kaç bit olduğu, adresleyebileceği hafıza miktarını belirler. Yani 32bit bir işlemci, 232 adet hafıza alanı adresleyebilir, ki bu da 4GB’tır. 64bit işlemcilerde ise bu limit terabyte’lar seviyesine çıkar. Dolayısıyla, 64bit işlemcili ortamlarda, mimari kısıtlamasından ziyade, bizi fiziksel hafızamızın (RAM) miktarı limitleyecektir. Bu nedenle, bu yazımda 32bit işlemcili ortamlar üzerinde duracağım.

32bit uygulamalar

32bit işlemcili bir makinede çalışan, 32bit bir Windows işletim sistemi, potansiyel olarak kullanabileceği 4GB hafızanın 2GB’ını “kernel”a ayırır. Her bir uygulama da yine en fazla 2GB hafıza kullanabilecektir. Bunu değiştirmenin tek yolu, /3GB parametresini kullanmaktır. Burada bu parametrenin detaylarından bahsedilmektedir. Bu parametre, “kernel” için ayrılan alanı 1GB’a indirip uygulamaların 3GB hafıza kullanabilmesini sağlar. Ancak bunu yapmadan önce, olası olumsuz sonuçları önlemek adına, bu makaleyi dikkatle incelemenizi önereceğim.

Bunlar .NET uygulamaları için ne anlama geliyor?

32bit ortamlarda çalışan .NET uygulamaları için de yukarıda bahsettiğim kısıtlamalar doğal olarak geçerlidir. Ancak, limitimiz, .NET’in yapısı gereği biraz daha düşük olacaktır. Yeterince fiziksel RAM’imiz olduğu durumlarda, /3GB parametresi yokken 800MB, varken 1800MB üst limitimiz olacaktır.

IIS ve ASP.NET açısından bakıldığında da aynı kısıtlamalar geçerlidir. Yani, IIS üzerinde çalışan bir ASP.NET uygulaması da en fazla 800MB (veya 1800MB) hafıza kullanabilecektir. IIS üzerindeki uygulamalar, w3wp.exe isimli “process”ler üzerinde çalıştığından (IIS 6.0 ve 7.0'da), burada bahsettiğimiz limitler de bunlar için geçerli olacaktır.

Pekiyi, bu limitler aşılırsa ne olur? Kullanılan hafıza miktarı 801MB’a ulaştığında w3wp.exe kapanır mı? Bu sorunun cevabı “hayır”. Bir w3wp.exe’nin kullandığı hafıza miktarı 800MB’a (veya tabii ki duruma göre 1800MB’a) yaklaştıkça, .NET’in “çöp toplayıcısı” (Garbage Collector - GC) daha sık devreye girmeye başlar. Bunun nedeni de elbette mümkün olduğunca çalışılabilecek yer açmaya çalışmasıdır. GC’nin daha sık devreye girmesi, CPU kullanımını artıracak ve performans kaybına neden olacaktır. 800MB aşıldıktan sonra, performans kayıplarına rağmen bir süre daha çalışmaya devam edebiliriz. Ancak bir yandan da “System.OutOfMemoryException” hataları almaya başlarız. Bu hataları, makinenin boş fiziksel hafızası olsa bile alırız.

Bu şekilde hafıza kullanımı artmaya devam ederse, yaklaşık olarak 800-1200MB aralığında bir yerde uygulama (bizim durumumuzda w3wp.exe) kapanacaktır. /3GB parametresi açıksa, uygulamanın kapanması 1800-2200MB aralığında olacaktır.

Eğer sunucumuzun 1.5GB’tan daha az fiziksel hafızası varsa, o zaman bu limitler daha da aşağıya inecektir. Limitleri şu şekilde hesaplayabiliriz:

MIN(800, RAM*%60)

Örn.:
2GB RAM için MIN(800, 2048*%60) = 800MB
1GB RAM için MIN(800, 1024*%60) ~= 600MB

Yukarıdaki formül, /3GB parametresi açık olan ortamlarda şu şekilde değişir:

MIN(1800, RAM*%60)

Bu limitler her bir "process" için geçerlidir. Yani eğer bizim birden fazla w3wp.exe'miz varsa bunların herbirinin ayrı ayrı limitleri olacaktır.

Referanslar

ASP.NET Performance Monitoring, and When to Alert Administrators

Chapter 6 — Improving ASP.NET Performance

Chapter 17 — Tuning .NET Application Performance

Recycling on a Used-Memory Threshold (IIS 6.0)

CENK ISCAN