IIS'nin uygulamamı geri dönüştürmediğinden emin olmak için ne yapmalıyım?


82

IIS'de barındırılan bir WCF servis uygulaması var. Başlangıçta, gider ve yerel önbellek olarak kullanmak için gerçekten pahalı (zaman ve işlemci açısından) bir kaynak alır.

Ne yazık ki, IIS işlemi oldukça düzenli olarak geri dönüştürüyor gibi görünüyor. Bu nedenle, IIS'nin uygulamayı geri dönüştürmeyeceğinden emin olmak için Uygulama Havuzundaki ayarları değiştirmeye çalışıyorum. Şimdiye kadar, aşağıdakileri değiştirdim:

  • CPU altında limit aralığı 5 ile 0 arasındadır.
  • 20 ile 0 arasında İşlem Modeli altında Boşta Kalma Zaman Aşımı.
  • 1740 - 0 Geri Dönüşüm altında Düzenli Zaman Aralığı.

Bu yeterli olacak mı? Ve değiştirdiğim ürünler hakkında özel sorularım var:

  1. CPU altındaki Limit Aralığı ayarının özel olarak anlamı nedir? Belirli bir CPU kullanımı aşıldığında, uygulama havuzunun geri dönüştürüleceği anlamına mı geliyor?
  2. "Geri dönüşümlü" tam olarak ne anlama geliyor? Uygulama tamamen parçalandı mı ve yeniden başlatıldı mı?
  3. "İşçi Süreci kapatma" ile "Uygulama Havuzu geri dönüşümü" arasındaki fark nedir? Süreç Modeli altındaki Boşta Kalma Zaman Aşımı belgeleri, çalışan sürecin kapatılması hakkında konuşuyor. Regular Time Interval (Geri Dönüşüm altında) Aralıklı dokümanlar uygulama havuzu geri dönüşümü hakkında konuşur. İkisi arasındaki farkı pek bilmiyorum. W3wp.exe, uygulama havuzunu çalıştıran çalışan işlem olduğunu düşündüm. Birisi bu ikisi arasındaki uygulamaya olan farkı açıklayabilir mi?

IIS7 ve IIS7.5 etiketlerinin olmasının nedeni, uygulamanın her ikisinde de çalışacağı ve cevapların sürümler arasında aynı olacağını ummasıdır.

Referans için görüntü: görüntü tanımını buraya girin


IIS ayarlarıyla yukarıdaki ekran görüntüsünü nereden aldınız?
Andrew William Ross

Bu, Gelişmiş Uygulama Havuzu özellikleri sayfasıdır.
TristanK

Yanıtlar:


105

geri dönüşüm

Geri dönüşüm, genellikle * uygulamanız için bir kapsayıcı olarak IIS'nin yeni bir işlem başlattığı ve daha sonra eskisi ShutdownTimeLimit'e öldürülmeden önce kendi isteğinden uzaklaşması için verir.

* - genellikle: DisallowOverlappingRotation / "Örtüşen geri dönüşümü devre dışı bırak" ayarına bakın

Öyle yıkıcı özgün süreç ve tüm devlet bilgisi atılır o. İşlem dışı oturum durumu (örneğin, Devlet Sunucusu veya bir veritabanı veya durumunuz küçükse bir çerez) kullanmak, bu sorunu çözmenize izin verebilir.

Ancak, varsayılan olarak çakışıyor - eski işlemden önce "[ShutdownTimeLimit] saniye geçiyor."

Ayarlar

Sorunuz: o sayfadaki tüm ayarlar bir şekilde geri dönüşümü kontrol eder. “Kapatma”, “proaktif geri dönüşüm” olarak tanımlanabilir - burada sürecin kendisinin gitme zamanının geldiğine karar verir ve düzenli bir şekilde çıkar.

Reaktif geri dönüşüm, WAS'ın bir problem tespit ettiği ve süreci vurduğu yerdir (uygun bir yedek W3WP kurduktan sonra).

Şimdi, işte bir formun veya diğerinin geri dönüşüme neden olabilecek bazı şeyler:

  • sağlıksız olduğuna karar veren bir ISAPI
  • herhangi bir modül kilitleniyor
  • boşta kalma zaman aşımı
  • işlemci sınırlayıcı
  • uygulama havuzu özelliklerini ayarlama
    • Annenin olarak verebilir bir noktada çığlık: "Dur toplama ona ya da daha iyisini almak asla!"
  • "ping" hatası * aslında kendi başına pinging yapmaz, çünkü adlandırılmış bir boru kullanır - daha fazla "yaşam tespiti"
  • yukarıdaki ekran görüntüsündeki ayarların tümü

Ne yapalım:

Genellikle:

  • Boşta kalma zaman aşımlarını devre dışı bırakın . 20 dakikalık hareketsizlik = bom! Bir sonraki gelen istek için yeni işlem. Bunu sıfıra ayarla.

  • Düzenli zaman aralığını devre dışı bırak - 29 saatlik varsayılan, çeşitli taraflarca "delice", "can sıkıcı" ve "akıllı" olarak tanımlanmıştır. Aslında, bunlardan sadece ikisi doğrudur.

  • İsteğe bağlı olarak DisallowRotationOnConfigChange'i açın (yukarıda, yapılandırma değişikliklerinde Reycling'i devre dışı bırakın ), yalnızca oynamayı kesemezseniz - bu, herhangi bir uygulama havuzu ayarını, çalışanın öldürülmesi gerektiğini çalışan işlemlere anında bildirmeden değiştirmenize olanak sağlar. Ayarların etkili olması için App Pool'u manuel olarak geri dönüştürmeniz gerekir; bu, ayarları önceden ayarlamanıza ve ardından geri dönüşüm işleminizle uygulamak için bir değişiklik penceresi kullanmanıza olanak sağlar.

  • Genel bir prensip olarak, ping özelliğini etkin bırakın . Bu senin güvenlik ağın. İnsanların bunu kapattıklarını gördüm ve sonra site zaman zaman süresiz olarak kilitleniyor, paniğe yol açıyor ... bu yüzden ayarlar görünüşte çok çok çok yavaş yanıt veren uygulamanız için çok agresifse, onları biraz geri çekin ve kapatmak yerine ne aldığınızı görün. (Kendi izleme süreciniz boyunca asılı W3WP'ler için otomatik kilitlenme modu dampingi oluşturmadıysanız)

Bu, iyi niyetli bir sürecin sonsuza dek yaşamasına neden olmak için yeterli. Eğer ölürse, kesinlikle değiştirilecektir. Askıda kalıyorsa, ping işlemi bunu yapmalı ve yenisi 2 dakika içinde başlamalıdır (varsayılan olarak; en kötü durumda hesaplanmalıdır: ping frekansına kadar + ping zaman aşımı + istekler yeniden çalışmaya başlamadan önce başlangıç ​​zamanı sınırı ).

CPU sınırlaması normalde ilginç değildir , çünkü varsayılan olarak kapalıdır ve yine de hiçbir şey yapmamak üzere yapılandırılmıştır; Süreci öldürecek şekilde yapılandırılmış olsaydı, tabii ki, bu bir geri dönüşüm tetiği olurdu. Bırak onu IIS 8.x için not, CPU Throttling de bir seçenek haline gelir.

Bir (IIS) AppPool (.Net) AppDomain değildir (ancak bir / bazı içerebilir)

Ama ... o zaman .Net alanına ve AppDomain geri dönüşümüne giriyoruz ki bu da devlet kaybına neden olabilir. (Bkz. Https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/ )

Kısa versiyon, siz (toplama ile tekrar!) İçerik klasöründe bir web.config dosyası dokunarak veya başka şeyler o klasördeki bir klasör ya da bir ASPX dosyası veya .. ... oluşturarak ve işte bunu yaklaşık Uygulama Havuzu geri dönüşümü kadar yıkıcı olduğu sürece, yerel kod başlangıç ​​maliyetlerini eksi (yalnızca bir yönetilen kod (.Net) konsepti olduğu için yalnızca yönetilen kod işleri burada olur).

Antivirüs ayrıca web.config dosyalarını tararken değişiklik bildirmesine neden olan ....


2
Bekle bekle bekle ... neden Antivirus'den bir web.config okumak OK bir değişiklik bildirimi tetiklesin? Bir web.config'e sebepsiz yere "dokunan" antivirüs, çöp kutusu imho.
Shiv

AV, sadece bir dosyayı taramak için en son kullanılan motor versiyonunu kaydeden, alternatif bir veri akışına sadece okumak olmayabilir, fakat yazabilir. Bir düşünce olarak.
TristanK

7

Nazik kontrol,

Neden Uygulama Havuzlarımızı Geri Dönüştürüyoruz?

Uygulama havuzlarının neden düzenli aralıklarla otomatik olarak geri dönüşecek şekilde yapılandırıldığının nedenini bulmak için web'de dolaşıyorsanız, bellek sorunlarıyla ilgili olmayan makul bir cevap bulmakta zorlanacaksınız. Genel olarak topluluk, bellek sorunlarından kaçınmak için web uygulamalarımızın (veya IIS'de barındırılan hizmet katmanlarının) geri dönüştürülmesi gerekeceği gerçeğini kabul etmiştir .

Kodunuz doğru çalışmaya devam etmek için düzenli aralıklarla yeniden başlatma gerektiriyorsa, bir şeyin açıkça yanlış olduğu görüşündeyim . Kodunuzda bir yerde bir hata var ve sorunu 'ortadan kaldırmak' için işlemi zaman zaman yeniden başlatmak yerine düzeltmeniz gerekiyor.

Gerçekten de .NET'te bellek yönetimine odaklanmaya başlamalı ve uygulamalarımızın sorunsuz çalışabildiğinden emin olmaya çalışmalıyız .


3
Bunun bir nedeni, .NET, çöp toplama işlemi gerçekleştiğinde sıkıştırılmayan 'büyük nesneler' (genellikle 85K veya daha büyük veya başka bir şey) için ayrı yığın kullanmasıydı (.NET 4.5.1'de olsa da LOH'yi sıkıştırma seçeneği eklediler) ve ASP.NET’te, sunucu tarafında HTML oluştururken, 85K HTML’nin (özellikle tablolar ve ızgaralar gibi tekrarlanan içerikler için) görülmesi nadir değildir ve bu HTML temel olarak bir noktada sadece sunucudaki devasa bir String nesnesidir ve büyük bir nesne, sonunda dolayısıyla OutOfMemoryException sonuçlanan geri dönüşüm, büyük nesne yığın parçalanması katkıda
nothingisnecessary

0

OP senaryosuna göre (başlatma / ısınma sırasında uzun başlatma), kontrol edilmesi gereken diğer bir şey, varsayılan değeri 90 saniye olan Başlangıç ​​zamanı sınırıdır (saniye). Başlatma, Başlangıç ​​zaman sınırından daha uzun sürerse, çalışan işlem sonlandırılabilir.

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.