IIS için yavaş başlangıç ​​yüklemesini düzeltme


129

IIS, düşük trafikli web siteleri için, kullanılmayan çalışan süreçleri geri dönüştüren sinir bozucu bir özelliğe sahiptir ve bir süre sonra siteye ilk kullanıcının çok uzun bir gecikme (30+ saniye) almasına neden olur.

Soruna bir çözüm arıyordum ve bu olası çözümleri buldum.

A. Uygulama Başlatma eklentisini kullanın

B. .NET 4 ile Otomatik Başlat'ı kullanın

C. Boşta kalma zaman aşımını devre dışı bırakın (IIS Sıfırlama altında)

D. Siteyi önceden derleyin

Merak ediyorum bunlardan hangisinin tercih edildiğini ve daha da önemlisi neden aynı soruna bu kadar çok çözüm var? (Benim tahminim öyle değiller ve ben sadece bir şeyi doğru anlamıyorum).

Düzenle

Sahne C görünüyor sitemde ısındı tutmak için yeterli olmak, ama benim sitemin yavaşlık gerçek kök ben soğuk oluyor nedenini anlamaya gibi olamaz Varlık Framework, ile ilgisi var olduğunu keşfettik. Maalesef henüz cevaplanmamış bu soruya bakın !

Sonunda, sitemin hızlı kalmasını sağlamak için ara sıra ziyaret etmek için bir ısınma senaryosu hazırlamak zorunda kaldım.


Merhaba arkadaşım, Performans C yeterli mi? Neden ? Sadece onu kullanmamız mı gerekiyor yoksa geri dönüştürmeyi de devre dışı bırakmamız mı gerekiyor? IIS7.5'in ikinci günün ilk isteğini her zaman çok yavaş hissediyorum
qakmak

Yanıtlar:


36

A, B ve D seçenekleri aynı kategoride görünüyorlar çünkü sadece başlangıç ​​zamanını etkiliyorlar, web sitesinin ısınması gibi kütüphanelerin derlenmesi ve hafızaya yüklenmesi gibi.

C'yi kullanmak, boşta kalma zaman aşımını ayarlamak, sunucuya sonraki isteklerin hızlı bir şekilde sunulması için yeterli olmalıdır (uygulama havuzunun yeniden başlatılması, saniye sırasına göre oldukça uzun sürer).

Bildiğim kadarıyla, o makinede paralel olarak çalışan diğer web sitelerinin ihtiyaç duyabileceği bellek tasarrufu için zaman aşımı var. Fiyat, bir seferlik yavaş yükleme süresidir.

Kullanıcı hareketsizliği durumunda uygulama havuzunun kapatılmasının yanı sıra, uygulama havuzu da varsayılan olarak her 1740 dakikada (29 saat) bir geri dönüşüm gerçekleştirecektir.

Technet'ten:

Internet Information Services (IIS) uygulama havuzları, uygulama çökmelerine, takılmalara veya bellek sızıntılarına neden olabilecek kararsız durumlardan kaçınmak için düzenli aralıklarla geri dönüştürülebilir.

Uygulama havuzu geri dönüşümü açık kaldığı sürece yeterli olacaktır. Ancak çoğu bileşen için gerçekten birinci sınıf performans istiyorsanız, bahsettiğiniz Uygulama Başlatma Modülü gibi bir şey de kullanmalısınız.


Öyleyse, boşta kalma zaman aşımını devre dışı bırakmanızı önerir misiniz? Bu, hat boyunca sorunlara neden olur mu (bunun bir nedeni olduğunu tahmin ediyorum)?
Cavyn VonDeylen

3
Bu aslında sorunumu çözmez (düzenlememe bakın), ancak orijinal sorumu yanıtladığınız için kabul ettim.
Cavyn VonDeylen

10

Web Barındırma Zorluğu

Çoğumuz (küçük şirketler ve bireyler) kadar paylaşılan bir sunucuda barındırılıyorsanız, makine yapılandırma seçeneklerinden hiçbirinin kullanılamayacağını hatırlamanız gerekir.

ASP.NET MVC Ek Yükü

Sitem, 20 dakikadan fazla bir süredir isabet almadığında (ve web uygulaması durdurulduğunda) en az 30 saniye sürüyor. Bu korkunç.

Performansı Test Etmenin Başka Bir Yolu

ASP.NET MVC başlangıcınız mı yoksa başka bir şey mi olduğunu test etmenin başka bir yolu var. Sitenize doğrudan vurabileceğiniz normal bir HTML sayfası bırakın.
Sorun ASP.NET MVC'nin başlatılmasıyla ilgiliyse, web uygulaması başlatılmamış olsa bile HTML sayfası neredeyse anında işlenecektir.
Problemin ASP.NET MVC başlangıcında olduğunu ilk kez bu şekilde anladım. İstediğim zaman bir HTML sayfası yükledim ve çok hızlı yükleniyordu. Ardından, bu HTML sayfasına ulaştıktan sonra ASP.NET MVC URL'lerimden birine ulaşırdım ve Chrome'da "raddev.us bekleniyor ..." mesajını alırdım.

Yararlı Komut Dosyası İçeren Başka Bir Test

Bundan sonra bir LINQPad yazdım ( http://linqpad.net adresine bakın) web siteme her 8 dakikada bir (uygulamanın kaldırılma süresinden daha az - bu 20 dakika olmalıdır) vuracak daha fazlası için : bakın) komut dosyası yazdım ve saatlerce çalışır.

Komut dosyası çalışırken web siteme girdim ve sitem her defasında son derece hızlı çıktı. Bu bana, yaşadığım yavaşlığın büyük olasılıkla ASP.NET MVC başlatma sürelerinden kaynaklandığı konusunda iyi bir fikir veriyor.

LinqPad'i alın ve aşağıdaki komut dosyasını çalıştırabilirsiniz - URL'yi kendi başınıza değiştirin ve çalışmasına izin verin ve bunu kolayca test edebilirsiniz. İyi şanslar.

NOT : LinqPad'de , sayfanızı alacak kitaplığı eklemek için F4'e basmanız ve System.Net'e bir referans eklemeniz gerekir.

AYRICA : Dize URL değişkenini, motorun çalışması için ASP.NET MVC sitenizden bir yol yükleyecek bir URL'yi gösterecek şekilde değiştirdiğinizden emin olun.

System.Timers.Timer webKeepAlive = new System.Timers.Timer();
Int64 counter = 0;
void Main()
{
    webKeepAlive.Interval = 5000;
    webKeepAlive.Elapsed += WebKeepAlive_Elapsed;
    webKeepAlive.Start();
}

private void WebKeepAlive_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    webKeepAlive.Stop();
    try
    {
        // ONLY the first time it retrieves the content it will print the string
        String finalHtml = GetWebContent();
        if (counter < 1)
        {
            Console.WriteLine(finalHtml);
        }
        counter++;
    }
    finally
    {
        webKeepAlive.Interval = 480000; // every 8 minutes
        webKeepAlive.Start();
    }
}

public String GetWebContent()
{
    try
    {
    String URL = "http://YOURURL.COM";
    WebRequest request = WebRequest.Create(URL);
    WebResponse response = request.GetResponse();
    Stream data = response.GetResponseStream();
    string html = String.Empty;
    using (StreamReader sr = new StreamReader(data))
    {
        html = sr.ReadToEnd();
    }
    Console.WriteLine (String.Format("{0} : success",DateTime.Now));
    return html;
    }
    catch (Exception ex)
    {
        Console.WriteLine (String.Format("{0} -- GetWebContent() : {1}",DateTime.Now,ex.Message));
        return "fail";
    }
}

3

Boştaki web sitenizi vurmak için bir ping servisi / komut dosyası yazmak, gitmenin en iyi yoludur çünkü tam bir kontrole sahip olacaksınız. Özel bir barındırma kutusu kiraladıysanız, bahsettiğiniz diğer seçenekler de mevcut olacaktır.

Paylaşılan bir barındırma alanında, ısınma komut dosyaları en iyi birinci seviye savunmadır (kendi kendine yardım en iyi yardımdır). İşte kendi web uygulamanızdan nasıl yapılacağına dair bir fikir paylaşan bir makale .


birisi aynı şeyi
ararsa diye

2

B'yi kullanırım çünkü bu, işçi işlemlerinin geri dönüşümü ile bağlantılı olarak, geri dönüşüm sırasında yalnızca bir gecikme olacağı anlamına gelir. Bu, normalde boşta kaldıktan sonra ilk isteğe yanıt olarak başlatma ile ilişkili gecikmeyi önler. Ayrıca geri dönüşümün faydalarını da koruyacaksınız.


2

Bir programa göre siteye ping atmak için iyi bir seçenek, ayda 750'ye kadar "çalıştırma" için ücretsiz olan Microsoft Flow'u kullanmaktır. Sitenizi sıcak tutmak için her saat başı gelen bir Akış oluşturmak çok kolaydır. Sitenizdeki birden çok isabeti ayıran gecikmelerle tek bir akış oluşturarak bunların 750 sınırını bile aşabilirsiniz.

https://flow.microsoft.com


1

Performans sorunlarına nasıl yardımcı olabileceğinizle ilgili ipuçları için bu makaleye bakın. Bu, "soğuk başlatma" bölümünün altındaki başlatmayla ilgili her iki performans sorununu da içerir. Bunların çoğu, yerel olarak veya üretimde ne tür bir sunucu kullanıyor olursanız olun önemli olacaktır.

http://blogs.msdn.com/b/mcsuksoldev/archive/2011/01/19/common-performance-issues-on-asp-net-web-sites.aspx

Uygulama XML'den herhangi bir şeyi seriyi kaldırırsa (ve web hizmetlerini de içerir…) SGEN'in deseria ile ilgili tüm ikili dosyalara karşı çalıştırıldığından emin olun ve ortaya çıkan DLL'leri Global Assembly Cache (GAC) içine yerleştirin. Bu, SGEN'in çalıştırıldığı derlemeler tarafından kullanılan tüm serileştirme nesnelerini önceden derler ve bunları elde edilen DLL'de önbelleğe alır. Bu, yapılandırma dosyalarının diskten ilk serileştirilmesi (yüklenmesi) ve web hizmetlerine yapılan ilk çağrılarda büyük zaman tasarrufu sağlayabilir. http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

Herhangi bir IIS sunucusunun internete giden erişimi yoksa, machine.config dosyasına generatePublisherEvidence = ”false” ekleyerek Authenticode ikili dosyaları için Sertifika İptal Listesi (CRL) denetimini kapatın. Aksi takdirde, her çalışan işlem, bir CRL listesi elde etmek için internete bağlanmaya çalışırken zaman aşımına uğrarken başlatma sırasında 20 saniyeden fazla askıda kalabilir. http://blogs.msdn.com/amolravande/archive/2008/07/20/startup-performance-disable-the-generatepublisherevidence-property.aspx

http://msdn.microsoft.com/en-us/library/bb629393.aspx

Tüm montajlarda NGEN kullanmayı düşünün. Ancak dikkatli bir şekilde kullanılmazsa bu pek bir performans kazancı sağlamaz. Bunun nedeni, her işlem tarafından yüklenen tüm ikili dosyaların temel yük adreslerinin, derleme sırasında çakışmaması için dikkatlice ayarlanması gerektiğidir. İkili dosyalar, adres çatışmaları nedeniyle yüklendiklerinde yeniden yüklenmek zorunda kalırsa, NGEN kullanmanın neredeyse tüm performans kazanımları kaybolacaktır. http://msdn.microsoft.com/en-us/magazine/cc163610.aspx


0

4 dakikalık hareketsizlikten sonra ilk talepte 15 saniyelik tutarlı bir gecikme alıyordum. Benim sorunum, uygulamamın SQL Server için Windows Tümleşik Kimlik Doğrulaması kullanıyor olması ve hizmet profilinin sunucudan farklı bir etki alanında olmasıydı. Bu, uygulama başlatıldığında IIS'den SQL'e bir çapraz etki alanı kimlik doğrulamasına neden oldu - ve bu benim gecikmemin gerçek kaynağıydı. Windows kimlik doğrulaması yerine SQL oturumu kullanmaya geçtim. Gecikme hemen geçti. Performansı artırmaya yardımcı olmak için hala tüm uygulama başlatma ayarlarına sahibim, ancak benim durumumda bunlara hiç ihtiyaç duyulmamış olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.