IIS 7.0 | Asp. Net Uygulamasının Performansını Nasıl Artırırsınız
Asp.NET Uygulamasının Performansını Nasıl Artırırsınız. Uygulama sunucusunda CPU tüketimi çok yüksek olan bir ASP.NET uygulamasının performansını nasıl yükseltirsiniz. Best practice.
ASP.NET üzerinde veri tabanı uygulaması geliştirirken dikkat edilmesi gereken temel noktaları aşağıdaki şekilde listeleyebiliriz.
Öncelikle İş Analizinin çok iyi yapılmış olması gerekir. İyi bir iş analistinin taşıması gereken en temel özelliklerle ilgili yazıyı buradan okuyabilirsiniz.
Veri tabanı tasarımının mümkün olduğu kadar normalizasyon kurallarına uygun bir şekilde yapılmış olması gerekir. Tabi ki raporlama ile ilgili veri tabanı sorgulamaları yapılıyorsa, bu durumda veri tabanını denormalize etmek gerekebilir.
Veri tabanı tablolarında uygun ve yeterli sayıda indekslerin oluşturulmuş olması gerekir. Bu indeksler üzerinde fragmantasyon oranlarının zaman içinde artacağı düşünülerek bu durumda rebuild edilmesi gerekir. Genel kabul olarak index lerin fragmantasyon oranlarının % 36 seviyesinin üstünde olması durumunda rebuild edilmesi fayda sağlayacaktır. Indekslerin fazla olması durumunda bu tablolara INSERT yapılacağı zaman performans düşüşüne sebep olabilir. Bu nedenle gereksiz yere index oluşturulmaması önemlidir.
Yazılım gelliştirilirken de dikkat edilmesi gereken birçok nokta var aslında. Bu makalede örnek bir durum ele alacağız.
Örnek Durum: Şöyle bir yazılım uygulaması düşünün
Internet üzerinden üyelik sistemi ile proje başvurusu alan bir sistem
İş Analizi iyi yapılmamış
Veri tabanı tasarımı normalizasyon kurallarına uygun olarak yapılmamış,
Web tabanlı bir yazılım
Yazılım uygulamasına login olunduğu anda, bu kişinin proje başvurusuyla ilgili bütün bilgiler veritabanından ilk seferde (ihtiyaç olduğu anda değil) çekiliyor ve tamamı InProc Session da tutuluyor.
Yazılım uygulamasında 20 sayfa var. Aslında bunlar webform olarak tasarlanmamış, hepsi bir usercontrol olarak tasarlanmış ve aynı webformun içine eklenmiş. Dolayısıyla webform load olurkenbütün usecontroller tüm property leri ile birlikte yükleniyor.
Veri tabanından çekilen bilgilerin içinde veritabanında binary olarak tutulan pdf ler dahi var.
Bir proje başvurusu ile ilgili çekilen bu verinin miktarı login olan kişi başıma 3 MB seviyesinde
Uygulama Sunucusu Donanımı:
İşlemci : 4core x 4 = 16 CPU
Network Hızı : 1 Gps
Sisteme login olan ilk kişi sistemi kullanmaya başladıktan sonra Uygulama Sunucusunda CPU kullanım oranı %95 seviyesine yükseliyor ve bir sonraki kişi login ekranın açılması(load olması) için bile yaklaşık 2 dak. beklemek zorunda kalıyor.
Kullanıcı adı ve parolasını girdikten sonra GİRİŞ tuşuna bastığında da login olmak için de ayrıca 2 dakika bekliyor.
Sunucu sayısı artırılabilir. Aynı sorunlar her sunucu için tekrar yaşanacaktır. Çünkü sorun sunucuda değil, yazılımda
Sunucu CPU sayısı artırılabilir. 32 CPU ya çıkarıldığında ortalama CPU kullanım oranını hala % 95 seviyesine çıktığı görüldü.
Uygulamanın InProc Session üzerinde tuttuğu veriyi, SQL-Server üzerinde tutulması sağlanabilir. Bu yapıldıktan sonra da Uygulama ApplicationPool'u üzerinde Maximum Worker Processes sayısını artırabiliriz. Bu şekilde, çok büyük boyuttaki(her login olan kişi için yaklaşık 3 MB) verinin SQL Server üzerindeki bir Sessionda tutulması sağlanmış olacaktır. Bu da uygulama sunucusunun CPU kullanım oranını azaltacaktır. Belki Veri tabanı sunucusu ile uygulama sunucusu arasındaki trafik bir miktar artacaktır ancak bu da Network hızının çok yüksek olması sayesinde tolere edilebilecektir.
3ncü alternatif çözüm tercih edilmiştir. Buna göre, sırayla aşağıdaki işlemler yapılmıştır:
Command Prompt açılır.
d:\Windows\Microsoft .NET\FrameWork\v2.0.50727 dizinin altına gidilir ve aşağıdaki komut çalıştırılır.
aspnet_regsql -S [Veri Tabanı Sunucusunun Adı ya da IP Adresi] -U [Veri tabanı Kullanıcı Adı] -P [Parola] -ssadd -sstype p
Uygulama Sunucusu üzerinde uygulamanın web.config dosyası üzerindeki sessionState de aşağıdaki şekilde olmalıdır:
<sessionState mode="InProc" timeout="20" allowCustomSqlDatabase="" allowCustomSqldatabase="true" sqlConnectionstring="Data Source=VeriTabanıSunucuAdi;User Id=KullaniciAdi; Password=Parola" cookieless="false"></sessionState>
Uygulama Sunucusu üzerinde IIS üzerinden ilgili Application Pool gelişmiş özellikleri (Advanced Settings) açılır ve buradaki Maximum Worker Processes sayısı yükseltilir. Örneğimizde 32 CPU su olan sunucuda bu sayı 8 Olarak kaydedilmiştir.
KAZANIMLAR / ELDE EDİLENLER
Uygulama sunucusu ortalama CPU kullanım oranı % 18 lere düşmüştür.
Login sayfasının yüklenmesi süresi 0.1 saniyeye düşmüştür.
Login geçiş süresi 3 sn. ye düşmüştür.
Uygulamadaki performans sorunu tamamen ortadan kalkmıştır.
InProc üzerinde session tutulmadığı için Uygulama sunucusu CPU kullanım oranında açık bir şekilde iyileşme görülürken, bu sunucunun RAM kullanım oranı artmıştır(istenen limitler dahilinde).
ETİKETLER : Maximum Worker Processes, w3wp.exe, performans, CPU utilization, sessionState, web.config