23 Ekim 2013 Çarşamba

Performans Problemi

Bu arada yeni bilgilerle bogusurken kurs baslamadan once bitirdigim bir web sitesinin sahibinden surekli telefon ve mail ile sitenin yavasligindan sikayet gelmeye basladi. Siteye ben girdigimde herhangi bir sorun ile karsilasmadim. Hatta oldukca da hizliydi diyebilirim. Anlam veremedim ama kafama da takildi. Sonra aksam tekrar baktigimda ilk giris sirasinda gercekten yavas oldugunu ama sonrasinda hizlandigini gordum.

Once browser cache kullanmaya basliyor herhalde dedim ama farkli bilgisayar farkli browser ile denedigimde de hizliydi. sonra hosting isi yaptigim zamanlarda IIS uzerinde "keep alive" ayarinin oldugu geldi aklima.

Biraz konuyu arastirinca sorunun, 20 dakika kimse siteye girmezse aplikasyonun askiya alinmasi ve sonra ilk giren ile aplikasyonun tekrar yuklenmesinde kaybedilen zamandan oldugunu farkettim.

Ilk cozum tabi ki hosting'de bu ayarin kaldirilmasiydi. Ancak malesef boyle bir secenek yoktu. O zaman ikinci secenek olan "siteye periyodik olarak istek gondererek hayatta tutmak" ustune yoneldim.en kolay yolu da istatistik amacli programlardi. Bunun icin yaptigim arastirmada http://my.pingdom.com sitesini buldum

 1 site icin ucretsiz olan hizmetine kayit olarak sitenin hem uptime, hem response time olarak 5 dakikalik araliklarla istatistiklerini almaya basladim. Hem de herhangi bir sorunda bana mail atmasini ayarlayarak siteyi bir kademe daha garantiye aldim.

Bunlarin disinda bir baska oneri de sorunu kodla cozmekti.
Yayindan kaldirilmis ama arsivde bulunan bir sitede asagidaki gibi bir kod vardi.

   private KeepAlive(string applicationUrl)
     {
         _applicationUrl = applicationUrl;
         _cacheKey = Guid.NewGuid().ToString();
         instance = this;
     }

     public static bool IsKeepingAlive
     {
         get
         {
             lock (sync)
             {
                 return instance != null;
             }
         }
     }

     public static void Start(string applicationUrl)
     {
         if(IsKeepingAlive)
         {
             return;
         }
         lock (sync)
         {
             instance = new KeepAlive(applicationUrl);
             instance.Insert();
         }
     }

     public static void Stop()
     {
         lock (sync)
         {
             HttpRuntime.Cache.Remove(instance._cacheKey);
             instance = null;
         }
     }

     private void Callback(string key, object value, CacheItemRemovedReason reason)
     {
         if (reason == CacheItemRemovedReason.Expired)
         {
             FetchApplicationUr();
             Insert();
         }
     }

     private void Insert()
     {
         HttpRuntime.Cache.Add(_cacheKey,
             this,
             null,
             Cache.NoAbsoluteExpiration,
             new TimeSpan(0, 10, 0),
             CacheItemPriority.Normal,
             this.Callback);
     }

     private void FetchApplicationUrl()
     {
         try
         {
             HttpWebRequest request = HttpWebRequest.Create(this._applicationUrl) as HttpWebRequest;
             using(HttpWebResponse response = request.GetResponse() as HttpWebResponse)
             {
                 HttpStatusCode status = response.StatusCode;
                 //log status
             }
         }
         catch (Exception ex)
         {
             //log exception
         }
     }
}

Ne yaptigina gelince.
cache'ye 10 dakikaligina bir obje koyuyor, 10 dakika doldugunda bu obje sitedeki herhangi bir sayfayi cagiriyor. Sayfa cagirilinca tekrar obje olusuyor ve boylece donup duruyor.

KeepAlive.Start(url) ile cagiriliyor. IsKeepingAlive ile durum kontrol ediliyor. KeepAliveStop ile de islem sonlandiriliyor.

Sitenin linki : http://web.archive.org/web/20100213092317/http://www.rexmorgan.net/journal/fixing_aspnet_ldquokeep

Hiç yorum yok:

Yorum Gönder