ASP.NET Bug: Sürekli bellek şişmesi

914 views
Skip to first unread message

Tuncer KARAARSLAN

unread,
Apr 19, 2013, 4:05:03 AM4/19/13
to AltDotNet
Merhaba arkadaşlar. Kısa bir sorum olacak. Ekteki dosyada 5-6 satır kod var. Hatta kodu buraya da yazıyorum.
 
protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            for (int i = 0; i < 10000; i++)
            {
                string controlStr = "<table><tr><td></td></tr></table>";
                Page.ParseControl(controlStr);
            }     
        }  
 
Yukarıdaki kodu incelediğinizde gayet masumane bir kod olarak görünüyor. 10 bin defa döngüye girmesinin nedeni, uzun zamandaki şişmenin hızla gözlemlenmesi için. Yukarıdaki kodu çalıştırdığımızda, hatta defalarca asp.net sayfasını refresh yaptığınızda, belleğin sürekli şiştiğini ve garbarage collector'ün işle m yapmadığını göreceksiniz. Bellek sürekli olarak şişiyor ve bir sonra sonra artık IIS makinesi çalışamaz hale geliyor, ya makine restart ediliyor ya da kaynaklar olmadık bir zamanda serbest bırakılıyor. Nasıl davrandığını sizde analiz edersiniz.
 
Page.ParseControl(controlStr);
 
Bu kod şirketin projesindeki bel kemiği kodlardan birisi ve teknolojik olarak değişiklik tavsiye etmek yersiz olacak. Bu sorunun aşılması konusunda deneyimleri olan arkadaşların tavsiyelerini bekliyorum.
 
Konu MS tarafında issue olarakda açıldı. Cevap bekliyoruz.
 
Yardımlarınız için şimdiden teşekkürler.
 
Tuncer KARAARSLAN
MemoryTest.zip

Ömer Çelik

unread,
Apr 19, 2013, 4:07:26 AM4/19/13
to altdotne...@googlegroups.com
Page.ParseControl(controlStr);

Bence bu metodun içini görmeden bir şeyler söylemek zor. Bu metodun içini profile ettiniz mi?

Ömer Çelik


2013/4/19 Tuncer KARAARSLAN <tun...@hotmail.com>

--
You received this message because you are subscribed to the Google Groups "altdotnetturkiye" group.
To unsubscribe from this group and stop receiving emails from it, send an email to altdotnetturki...@googlegroups.com.
To post to this group, send email to altdotne...@googlegroups.com.
Visit this group at http://groups.google.com/group/altdotnetturkiye?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

Tuncer KARAARSLAN

unread,
Apr 19, 2013, 4:15:02 AM4/19/13
to AltDotNet
Sandığım kadarı ile redgate gibi bir ürünle dibine kadar bir analiz yapılmadı.  Sorunun nedeni olan kod tespit edildi sadece. Çözüm olarak şu ana kadar bir kaynak bulunamadı. BU gün redgate ürünlerinden birisi ile test yapılacak. Ancak sorunun nedenini bulsak da, bug fix edilmeden sorun çözülmeyecek. Bunuda ancak MS tarafından yama ile çözmek mümkün olacaktır. Daha kestirme bir çözüm bana daha fazla yardımcı olacaktır.
 
Tavsiyen için teşekkür ederim. Dediğin noktayı dikkate alacağım.

From: omer...@gmail.com
Date: Fri, 19 Apr 2013 11:07:26 +0300
Subject: Re: [altdotnetturkiye] ASP.NET Bug: Sürekli bellek şişmesi
To: altdotne...@googlegroups.com

Mehmet Kut

unread,
Apr 19, 2013, 4:55:56 AM4/19/13
to altdotne...@googlegroups.com
Tuncer selamlar,

Döngü içinde string yerine StringBuilder kullansanız.
Ek olarak Page.ParseControl içerisinde de varsa string yerine StringBuilder kullanın
string operasyonlarınız için. Memory nin hızla düştüğünü göreceksiniz. Redgate le test yaparsanız
container in çok büyük alan kapladığını göreceksiniz. O zaman string den direk kıllanın zaten.

Tabi bu söylediklerim varsayım kolay gelsin.



2013/4/19 Tuncer KARAARSLAN <tun...@hotmail.com>

Murat Haksal

unread,
Apr 19, 2013, 6:09:29 AM4/19/13
to altdotne...@googlegroups.com
Döngü icinde değişken tanimlamaktan kaynaklı, stringi scope dışına alıp test alır misin hocam
--
You received this message because you are subscribed to the Google Groups "altdotnetturkiye" group.
To unsubscribe from this group and stop receiving emails from it, send an email to altdotnetturki...@googlegroups.com.
To post to this group, send email to altdotne...@googlegroups.com.
Visit this group at http://groups.google.com/group/altdotnetturkiye?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.
 
 
<MemoryTest.zip>

Emre Aydemir

unread,
Apr 19, 2013, 6:14:22 AM4/19/13
to altdotne...@googlegroups.com

Arkadaş döngü içerisindeki string 10mb etkilesin, burdaki durum 1-2 gb lık ram kullanımı.

 

 

From: altdotne...@googlegroups.com [mailto:altdotne...@googlegroups.com] On Behalf Of Murat Haksal
Sent: Friday, April 19, 2013 1:09 PM
To: altdotne...@googlegroups.com
Subject: Re: [altdotnetturkiye] ASP.NET Bug: Sürekli bellek şişmesi

 

Döngü icinde değişken tanimlamaktan kaynaklı, stringi scope dışına alıp test alır misin hocam

Emre Aydemir

unread,
Apr 19, 2013, 6:22:15 AM4/19/13
to altdotne...@googlegroups.com

“Arkadaşlar” demek istedim.

 

From: Emre Aydemir [mailto:emra...@gmail.com]
Sent: Friday, April 19, 2013 1:14 PM
To: 'altdotne...@googlegroups.com'
Subject: RE: [altdotnetturkiye] ASP.NET Bug: Sürekli bellek şişmesi

 

Arkadaş döngü içerisindeki string 10mb etkilesin, burdaki durum 1-2 gb lık ram kullanımı.

 

 

From: altdotne...@googlegroups.com [mailto:altdotne...@googlegroups.com] On Behalf Of Murat Haksal
Sent: Friday, April 19, 2013 1:09 PM
To: altdotne...@googlegroups.com
Subject: Re: [altdotnetturkiye] ASP.NET Bug: Sürekli bellek şişmesi

 

Döngü icinde değişken tanimlamaktan kaynaklı, stringi scope dışına alıp test alır misin hocam

Mehmet Kut

unread,
Apr 19, 2013, 6:45:02 AM4/19/13
to altdotne...@googlegroups.com
stringler tahmininden çok daha fazla 
​yer kaplar.
immutable dır. döngü dışında veya içinde tanımlasanda fark etmer += kullandığın an 
yeni bir kopyasını oluşturur 
memoryde.
​ 


2013/4/19 Emre Aydemir <emra...@gmail.com>

Tuncer KARAARSLAN

unread,
Apr 19, 2013, 7:16:57 AM4/19/13
to AltDotNet
Bu konudaki tüm olasılıkların testini yaptım Muratcım. Sonuç yine aynı.
 

Subject: Re: [altdotnetturkiye] ASP.NET Bug: Sürekli bellek şişmesi
From: murat....@gmail.com
Date: Fri, 19 Apr 2013 13:09:29 +0300
To: altdotne...@googlegroups.com

Murat Haksal

unread,
Apr 19, 2013, 7:19:45 AM4/19/13
to altdotne...@googlegroups.com, AltDotNet
Parsecontrol bakmak lazım o vakit

Tuncer KARAARSLAN

unread,
Apr 19, 2013, 7:21:29 AM4/19/13
to AltDotNet
Emre haklısın, sayfada sürekli F5 yapıldığında belleğin sürekli 60MB civarında şiştiğini gözlemliyorum. Sonuçta bellek hatası verip uygulama kapanıyor. Page.ParseControl(controlStr); Komutunun geri gönderdiği tip control. Aslında using bloğu ile kullanmam, dispose etmem, GC ile direkt yönetim kodları yazmama rağmen üretilen controller temizlenmiyor. Sorun sadece string durum değil.

 

Control c = Page.ParseControl(controlStr);

 

Burda üretilen controller serbest bırakılmıyor. Ne denediysem hikaye oldu :)


From: emra...@gmail.com
To: altdotne...@googlegroups.com
Subject: RE: [altdotnetturkiye] ASP.NET Bug: Sürekli bellek şişmesi
Date: Fri, 19 Apr 2013 13:14:22 +0300

Tuncer KARAARSLAN

unread,
Apr 19, 2013, 7:25:02 AM4/19/13
to AltDotNet
Demin Emreye cevaben daha net sorunu tanımladım aslında. Sorun üretilen control tipindeki nesnelerin serbest bırakılamaması.

Page.ParseControl(controlStr);

Bu kod .net tarafından gelen framework kodu. Sonradan overload edilmiş bir kod değil. Belkide page yeniden ezilip parseControl yeniden yazılmalı dicem de sorunun fonksiyon olduğunu sanmıyorum. Ürettiği control nesnelerini silemiyorsun kesinlikle. Bir şekilde webdav kilitlemiş nesneleri kullanıyor gibi.


Subject: Re: [altdotnetturkiye] ASP.NET Bug: Sürekli bellek şişmesi

Date: Fri, 19 Apr 2013 14:19:45 +0300
To: altdotne...@googlegroups.com

Süleyman PETEK

unread,
Apr 19, 2013, 7:41:50 AM4/19/13
to altdotne...@googlegroups.com
Kodu şöyle yazsan daha iyi değil mi ?
 
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
string controlStr;

            for (int i = 0; i < 10000; i++)
{
                controlStr = "<table><tr><td></td></tr></table>";
Page.ParseControl(controlStr);
}
 
10000 ayrı string objesi oluşturmadan...


2013/4/19 Tuncer KARAARSLAN <tun...@hotmail.com>

--

Tuncer KARAARSLAN

unread,
Apr 19, 2013, 7:51:40 AM4/19/13
to AltDotNet
Bunuda denedim. Değişen bir şey yok.
 
Sorun string ifadenin yazılımı değil. Burda  yaklaşık 30 karakterlik bir string var. 10.000 döngüde 60 MB bellek artışına neden olmaz. En önemlisi de sayfa üretilmiş ve fonksiyon sonlanmış. Bu durumda GC devreye girip nesnelerin tümünü serbest bırakması gerekliydi. Asla serbest bırakmıyor.
 
Aslında aşağıdaki 10.000 döngü sorunu görebilmeniz için yaratılmış bir senaryo kodu.
 
IIS üzerinde sürekli çalışan ve günde 10.000 request veren sayfaların base sayfasında böyle 10 tane kod olduğunu düşünün. Günde 60-100 MB şişen bir webdav. 1 ay sonra IIS çöker. Kısaca gerçekleşecek felaket senaryosu bu şekilde gerçekleşiyor :)
 
 

Date: Fri, 19 Apr 2013 14:41:50 +0300

Subject: Re: [altdotnetturkiye] ASP.NET Bug: Sürekli bellek şişmesi

Sidar Ok

unread,
Apr 19, 2013, 7:57:23 AM4/19/13
to altdotne...@googlegroups.com
Neden ParseControl ? Burada istenilen ne?


2013/4/19 Tuncer KARAARSLAN <tun...@hotmail.com>

Emre Aydemir

unread,
Apr 19, 2013, 7:57:23 AM4/19/13
to altdotne...@googlegroups.com

Oluşan controller dispose olmadığı için bellek şişiyor (using ve dispose metodlarının tetiklenmeside işi görmüyor), döngü sayısını 100.000 yaparsanız çok daha net anlaştır, direk 300-400 mb şişiyor.

PageLoad’ ında GC yi manuel tetiklediğinizde memory düşüyor(bazen) işimize yarar ama sorun hala var.

Oğuzhan YILMAZ

unread,
Apr 19, 2013, 8:06:21 AM4/19/13
to altdotne...@googlegroups.com
Test ettim şimdi Win. 2008 R2 IIS 7.5 .Net 4.0 ve x64  üzerinde bende olmuyor bu olay? Anca arka arkaya refresh yapıldığı zaman CPU'ya vuruyor ama Ram 20MB'ı geçmedi henüz. 


Belki bizim ürünün yaptığı aspnet config'inden kaynaklanıyor olabilir Orada GC daha efektif çalışsın diye bir kaç config değiştiriyoruz. Aşağıdaki gibi.

"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Aspnet.config"

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <runtime>
    <legacyUnhandledExceptionPolicy enabled="false" />
    <legacyImpersonationPolicy enabled="true" />
    <alwaysFlowImpersonationPolicy enabled="false" />
    <SymbolReadingPolicy enabled="1" />
    <gcServer enabled="false" />
    <gcConcurrent enabled="false" />
    <gcTrimCommitOnLowMemory enabled="true" />
<generatePublisherEvidence enabled="false"/>
  </runtime>
</configuration>

gibi.




Oğuzhan


19 Nisan 2013 14:57 tarihinde Emre Aydemir <emra...@gmail.com> yazdı:

Tuncer KARAARSLAN

unread,
Apr 19, 2013, 8:27:57 AM4/19/13
to AltDotNet
Selam Sidar, eskiden bu yana geliştirilen bir proje (ASP.NET). aspx sayfaları yok ortada. Tüm sayfalar embed resource edilmiş eve dll olarak geliştirilmiş küçük küçük porojelerden oluşan bir yapı. Ancak şu ana kadar ortaya çıkan dll sayısı 300-500. İçlerindeki sayfalar açısından bakıldığında belkide 300-500-1000 civarında sayfa vardır. Projenin geliştirilme tekniğinden dolayı bazen nesler runtime zamanda yaratılıyor.

 

İşin garip tarafı aynı kodu asp.net 2.0 projesi olarak açtığınızda bellek yönetimi mükemmel. Bu sorun hiç ortaya çıkmıyor :) Ancak projeyi eski bir teknolojiye downgrade etmeyi istemiyoruz.



Date: Fri, 19 Apr 2013 13:57:23 +0200


Subject: Re: [altdotnetturkiye] ASP.NET Bug: Sürekli bellek şişmesi

Tuncer KARAARSLAN

unread,
Apr 19, 2013, 8:33:32 AM4/19/13
to AltDotNet
An exception of type 'System.OutOfMemoryException' occurred in System.Web.dll but was not handled in user code

 

Sayfayı 15-20 defa refresh yaptığımda sonuç yukarıda. Config parametreleri işe yaramadı gibi görünüyor.



From: asp...@gmail.com
Date: Fri, 19 Apr 2013 15:06:21 +0300


Subject: Re: [altdotnetturkiye] ASP.NET Bug: Sürekli bellek şişmesi

Oğuzhan YILMAZ

unread,
Apr 19, 2013, 8:42:43 AM4/19/13
to altdotne...@googlegroups.com
Birde, aklıma geldi yerse :)

dynamicIdleThreshold açıktı bende.Normalde kapalı gelir. Yine ram ile alakalı.

%windir%\system32\inetsrv\appcmd set config -section:system.applicationHost/webLimits -dynamicIdleThreshold:130

ile açıp deneyebilir misin.

Oğuzhan


19 Nisan 2013 15:33 tarihinde Tuncer KARAARSLAN <tun...@hotmail.com> yazdı:

Tuncer KARAARSLAN

unread,
Apr 19, 2013, 8:52:05 AM4/19/13
to AltDotNet
Aynı hocam.

 

"'System.OutOfMemoryException' türünde özel durum oluşturuldu."

 

Bir süre sonra yine patlıyor. 20 defa refresh ettim, yani ortalama 20 gün yaşlandırdım. Sonuç değişmedi


From: asp...@gmail.com
Date: Fri, 19 Apr 2013 15:42:43 +0300

ersin caliskan

unread,
Apr 19, 2013, 9:14:54 AM4/19/13
to altdotne...@googlegroups.com
Selam ,

web config içine bu parametreyi girip denermisin. Bende sorun düzeldi.

 <appSettings>
    <add key="PageInspector:ServerCodeMappingSupport" value="Disabled" />
  </appSettings>



2013/4/19 Tuncer KARAARSLAN <tun...@hotmail.com>



--
Ersin Çalışkan

Tuncer KARAARSLAN

unread,
Apr 19, 2013, 9:25:35 AM4/19/13
to AltDotNet
Ersin, çok teşekkürler. Sorun çözüldü. Gönderdiğin kod sorunun çözümü :)
 
Çok teşekkürler
 

Date: Fri, 19 Apr 2013 16:14:54 +0300

Subject: Re: [altdotnetturkiye] ASP.NET Bug: Sürekli bellek şişmesi

Oğuzhan YILMAZ

unread,
Apr 19, 2013, 9:26:05 AM4/19/13
to altdotne...@googlegroups.com
haha süper :)

Oğuzhan


19 Nisan 2013 16:25 tarihinde Tuncer KARAARSLAN <tun...@hotmail.com> yazdı:

ersin caliskan

unread,
Apr 19, 2013, 9:27:37 AM4/19/13
to altdotne...@googlegroups.com
Önemli değil :)


2013/4/19 Oğuzhan YILMAZ <asp...@gmail.com>



--
Ersin Çalışkan

Tuncer KARAARSLAN

unread,
Apr 19, 2013, 9:29:44 AM4/19/13
to AltDotNet
Bir bilsen ne kadar önemliydi :)) Ciddi bir sorunu daha aştık. Yeni ufuklara devam.

 

Destek veren tüm arkadaşlara teşekkür ederim.

 


Date: Fri, 19 Apr 2013 16:27:37 +0300

Mehmet Kut

unread,
Apr 19, 2013, 9:29:17 AM4/19/13
to altdotne...@googlegroups.com
geçmiş olsun :)


2013/4/19 ersin caliskan <caliska...@gmail.com>

Oğuzhan YILMAZ

unread,
Apr 19, 2013, 9:31:49 AM4/19/13
to altdotne...@googlegroups.com
AltnetTurkiye çalışıyor :)

slogan olur bu.

Oğuzhan


19 Nisan 2013 16:29 tarihinde Tuncer KARAARSLAN <tun...@hotmail.com> yazdı:

Mehmet Kut

unread,
Apr 19, 2013, 9:35:53 AM4/19/13
to altdotne...@googlegroups.com


2013/4/19 Oğuzhan YILMAZ <asp...@gmail.com>
Reply all
Reply to author
Forward
0 new messages