Her yeniden başlatmanın ardından neden yerel .NET sitelerimin ilk kez yüklenmesi zaman alıyor? [kapalı]


27

.NET platformunu temel alan siteler geliştiriyorum. Bu siteleri genellikle yerel IIS’de kullanırım, böylece yayına girmeden önce bunları test edebilir ve işlevlerini görebilirim. Ancak, pencereleri her başlattığımda, sitelerin ilk kez çalıştırılması uzun zaman alıyor gibi görünüyor.

JIT'i biliyorum ve bu sorunun farkındayım , ancak sorumu cevaplamıyor.

JIT, pencereleri her başlatışınızda oluyor mu? W3wp.exe işleminin oluşturulmasıyla ilgili mı? Her yeniden başlatmadan sonra siteler ilk istek için neden bu kadar yavaş?


3
Bu "soğuk başlangıç" veya başka bir şey olarak bilinir. Sistem, vs. RAM önbellekte olmasın da, diskten veri okumak da ilgili tüm DLL, muhtemelen JIT malzeme, süreç ithalat tabloları ihtiyacı belleğe w3wp, yüklemek zorunda
Coder

Yorumunuz için @Coder, +1. Fakat lütfen cevabınızla daha fazla açıklama yapabilir misiniz? :)
Saeed Neamati

IIS benim uzmanlık alanım değil, umarım birileri daha iyi bir cevap verecektir. İşte bir süre önce başladığım benzer bir konu stackoverflow.com/questions/3807791/cold-startup-optimization Belki biraz daha yardımcı olur.
Kodlayıcı

4
Bu soru konu dışı gibi görünüyor çünkü kavramsal bir programlama problemi değil, bir uygulama konusu ile ilgili.

Yanıtlar:


32

Bu sorun JIT derlemesidir. Uygulama havuzunun, kitaplıkları işlemeye başlamadan önce oluşturmak için zamana ihtiyacı vardır. Bu bir ısınma betiği kullanılarak hızlandırılabilir, ancak bu olması gereken bir şey. Ayrıca bir web sitesi mi yoksa bir web uygulaması projesi mi kullandığınıza da bağlıdır. Her sayfa için bir web sitesi JIT, bu nedenle ilk isabet yavaştır ve her yeni isabetin de ekstra bir derleme süresi vardır. Web uygulaması projeleri önceden derlenmiştir; bu nedenle bu isabetin çok kötü olması olmamalıdır, ancak kütüphanelerin hala yüklenmesi gerekir. Daha fazla kütüphane / araç bu isabet daha kötü olur eğilimindedir. İşte ısınmayı tartışan bazı bağlantılar:

http://weblogs.asp.net/gunnarpeipman/archive/2010/01/22/iis-application-warm-up-module.aspx http://blogs.iis.net/steveschofield/archive/2009/05/30 /application-pool-warm-up.aspx /programming/2063461/iis-web-applications-warmup http://sharepoint.smayes.com/2011/06/application-pool-specific-warm -up-komut /


6
Bu çoğunlukla doğrudur, ancak derleme ile jiting arasında bu cevapta açık olmayan bir fark vardır. Jitting, .NET bayt kodunu makine koduna derliyor. ASP.NET aslında bu web sayfalarını bir Web Uygulaması Projesinde bile (aspnet_compiler kullanmıyorsanız) derlemektedir . Tüm bu derleme / derleme zamanı, ayrıca jitting ve kütüphane yükleme zamanı, neden bu kadar yavaş.
Aaron

JIT tam zamanında duruyor. "Jitting" ile "compiling" arasında, derlenen kodun zamanlaması ve miktarının ötesinde bir fark yoktur. Ayrıca, JIT derlemesi yalnızca her sayfa için değil, her ziyaret edilmemiş kod için gerçekleşir. Aynı şablonu kullanıyorlarsa, örneğin derleme gerekli değildir. Daha fazla kütüphanenin derleme için daha fazla zaman harcadığına dikkat edilmesi elbette tamamen doğru.
Cornelius,

9

İlk isteğinizdeki yavaş tepki, IIS'nin yalnızca ilk gelen isteğinde bir site veya uygulama havuzunu başlatması / yüklemesidir. Ve belirli bir süre sonra, sunucuya yeni gelen hiçbir istek gelmiyorsa, IIS siteyi yeniden durdurur (uygulama havuzu geri dönüşümü).

ASP.NET 4.0, otomatik başlatma adı verilen yeni bir özelliğe sahiptir. Bu özellik sayesinde, herhangi bir istekten önce kendisini başlatmak için bir uygulama havuzu veya ayrı bir site ayarlayabilirsiniz. Bu, önyükleme sırasında (IIS başladığında) veya bir ASP.NET sitesini (siteyi durduran) güncellediğinizde tetiklenir.

<applicationPools>
    <add name="MyAppPool" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>

<sites>
    <site name="MySite" id="1">
        <application path="/" serviceAutoStartEnabled="true" />
    </site>
</sites>

Bunu kullanmak için IIS 7.5'e ihtiyacınız var.

Otomatik başlatmaya başladığında, bazı ekstra görevleri yerine getirme seçeneği de vardır, örn. verileri önbelleğe yüklemek için.


Normalde tam sitenizi web sunucusuna koymadan önce derlersiniz, böylece kodun ilk istek üzerine daha fazla derlenmesi gerekmez. JIT, yalnızca kaynak kodunuzu web sitesinde yayınladığınız App_code klasörünü kullanan siteler için kullanılır.
Stief

2

Sorunun bir kısmı da GAC'dir. Kütüphaneler, her yerleştirildiklerinde güvenlik kontrolüne ihtiyaç duyacakları yerler - bu da tam bir şifreleme tipi çalışmanın gerçekleştiği anlamına gelir ve bu da işleri yavaşlatır. WPF performansı hakkında bir süre önce MS'ten bu sorunu tanımlayan bir konuşma yapıldı - cevapları "eğer yardım edemezsen GAC'a bir şeyler koyma" idi.


1
Çifte olumsuzluktan kaçınmak için "yardımcı olabilir" olmalı
Richard Szalay

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.