Co powinienem zrobić, aby upewnić się, że IIS nie przetwarza mojej aplikacji?

82

Mam aplikację usługi WCF hostowaną w usługach IIS. Po uruchomieniu uruchamia się i pobiera naprawdę kosztowny (pod względem czasu i procesora) zasób do wykorzystania jako lokalna pamięć podręczna.

Niestety wydaje się, że IIS przetwarza ten proces dość regularnie. Próbuję więc zmienić ustawienia w puli aplikacji, aby upewnić się, że IIS nie przetwarza aplikacji ponownie. Do tej pory zmieniłem następujące elementy:

  • Limit interwału przy CPU od 5 do 0.
  • Limit czasu bezczynności w modelu procesu od 20 do 0.
  • Regularny odstęp czasu w ramach recyklingu od 1740 do 0.

Czy to wystarczy? I mam konkretne pytania dotyczące przedmiotów, które zmieniłem:

  1. Co konkretnie oznacza ustawienie Limit interwału w CPU? Czy to oznacza, że ​​jeśli pewne użycie procesora zostanie przekroczone, pula aplikacji zostanie ponownie przetworzona?
  2. Co dokładnie oznacza „z recyklingu”? Czy aplikacja jest całkowicie rozebrana i uruchomiona ponownie?
  3. Jaka jest różnica między „zamknięciem procesu roboczego” a „recyklingiem puli aplikacji”? Dokumentacja limitu czasu bezczynności w Modelu procesu mówi o wyłączeniu procesu roboczego. Podczas gdy dokumenty dotyczące regularnego przedziału czasu w części Recykling mówią o recyklingu puli aplikacji. Nie do końca rozumiem różnicę między nimi. Myślałem, że w3wp.exe to proces roboczy, który uruchamia pulę aplikacji. Czy ktoś może wyjaśnić różnicę między aplikacją?

Powodem posiadania tagów IIS7 i IIS7.5 jest to, że aplikacja będzie działać w obu wersjach i mam nadzieję, że odpowiedzi będą takie same między wersjami.

Zdjęcie w celach informacyjnych: wprowadź opis zdjęcia tutaj

AngryHacker
źródło
Skąd masz powyższy zrzut ekranu z ustawieniami IIS?
Andrew William Ross,
To arkusz właściwości Puli aplikacji zaawansowanych.
TristanK

Odpowiedzi:

105

Recykling

Recykling to zwykle * miejsce, w którym IIS uruchamia nowy proces jako kontener dla aplikacji, a następnie oddaje stary do ShutdownTimeLimit, aby odszedł z własnej woli, zanim zostanie zabity.

* - zwykle: patrz ustawienie DisallowOverlappingRotation / „Wyłącz nakładające się przetwarzanie”

Jest destrukcyjny , ponieważ pierwotny proces i wszystkie informacje o jego stanie są odrzucane. Użycie stanu sesji poza procesem (np. Serwer stanu lub baza danych, a nawet plik cookie, jeśli stan jest niewielki) może pozwolić na obejście tego.

Ale domyślnie się nakłada - co oznacza, że ​​czas trwania awarii jest minimalizowany, ponieważ nowy proces rozpoczyna się i jest podłączony do kolejki żądań, zanim poprzedni zostanie poinformowany: „masz jeszcze [ShutdownTimeLimit] sekund na odejście. Przestrzegaj”.

Ustawienia

Na twoje pytanie: wszystkie ustawienia na tej stronie w jakiś sposób kontrolują recykling. „Wyłączenie” można opisać jako „proaktywny recykling” - gdy sam proces decyduje, że nadszedł czas, i kończy się w uporządkowany sposób.

Recykling reaktywny polega na tym, że WAS wykrywa problem i uruchamia proces (po ustaleniu odpowiedniego zastępczego W3WP).

Oto kilka rzeczy, które mogą spowodować recykling jednej lub innej formy:

  • ISAPI decydujący, że jest niezdrowy
  • awaria dowolnego modułu
  • limit czasu bezczynności
  • ograniczenie procesora
  • dostosowywanie właściwości puli aplikacji
    • ponieważ mama w pewnym momencie mogła krzyczeć: „Przestań się na to zbierać, bo inaczej nie będzie lepiej!”
  • błąd „ping” * nie pinguje sam w sobie, ponieważ używa nazwanego potoku - więcej „detekcji życia”
  • wszystkie ustawienia na zrzucie ekranu powyżej

Co robić:

Ogólnie:

  • Wyłącz limity czasu bezczynności . 20 minut bezczynności = bum! Nowy proces przy następnym przychodzącym żądaniu. Ustaw to na zero.

  • Wyłącz regularny przedział czasu - domyślnie 29 godzin zostało opisane przez różne strony jako „szalone”, „denerwujące” i „sprytne”. W rzeczywistości tylko dwa z nich są prawdziwe.

  • Opcjonalnie włącz DisallowRotationOnConfigChange (powyżej, Wyłącz recykling dla zmian konfiguracji ), jeśli po prostu nie możesz przestać się nim bawić - pozwala to zmienić dowolne ustawienie puli aplikacji bez natychmiastowego sygnalizowania procesom roboczym, że należy go zabić. Aby ręcznie zastosować ustawienia, musisz ręcznie ponownie przetworzyć pulę aplikacji, co pozwala wstępnie skonfigurować ustawienia, a następnie użyć okna zmian, aby zastosować je w procesie recyklingu.

  • Zgodnie z ogólną zasadą pozostaw pingowanie włączone . To twoja siatka bezpieczeństwa. Widziałem, jak ludzie to wyłączają, a potem witryna czasami zawiesza się, co prowadzi do paniki ... więc jeśli ustawienia są zbyt agresywne dla twojej pozornie bardzo, bardzo wolno reagującej aplikacji, cofnij je trochę i zobacz, co dostajesz, zamiast go wyłączać. (Chyba że masz skonfigurowane automatyczne zawieszanie trybu zawieszania dla zawieszonych W3WP poprzez własny proces monitorowania)

To wystarczy, aby dobrze zachowany proces trwał wiecznie. Jeśli umrze, na pewno zostanie zastąpiony. Jeśli to wisi, należy podnieść, że pingowanie się a nowy powinny rozpocząć się w ciągu 2 minut (domyślnie najgorszy oblicz powinno być: do częstotliwości ping + ping Timeout + terminie startowego przed wnioski znów zacznie działać).

Ograniczanie procesora zwykle nie jest interesujące, ponieważ domyślnie jest wyłączone, a ponadto jest skonfigurowane tak, aby nic nie robić; gdyby był skonfigurowany do zabicia procesu, to z pewnością byłby to wyzwalacz recyklingu. Zostaw to. Uwaga dla IIS 8.x, Ograniczanie procesora również staje się opcją.

AppPool (IIS) nie jest aplikacją (.Net) AppDomain (ale może zawierać jedną / kilka)

Ale ... wtedy wchodzimy do ziemi .Net i recyklingu AppDomain, co może również powodować utratę stanu. (Zobacz: https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/ )

Krótka wersja, robisz to, dotykając pliku web.config w folderze zawartości (ponownie przy pobieraniu!), Lub tworząc folder w tym folderze, plik ASPX lub ... inne rzeczy ... i to o tak destrukcyjne, jak recykling puli aplikacji, pomniejszony o koszty uruchamiania kodu natywnego (jest to koncepcja kodu zarządzanego (.Net), więc dzieje się tu tylko kod zarządzany).

Program antywirusowy może to również uruchomić, skanując pliki web.config, powodując powiadomienie o zmianie, powodując ...

TristanK
źródło
2
Poczekaj czekaj czekaj ... dlaczego ODCZYTANIE pliku web.config z programu antywirusowego wyzwala powiadomienie o zmianie? Wszelkie programy antywirusowe, które „dotykają” pliku web.config bez powodu, to śmieci imho.
Shiv
AV może nie tylko czytać, ale także pisać - na przykład do alternatywnego strumienia danych, rejestrując wersję silnika ostatnio użytą do skanowania pliku. Jako myśl
TristanK
7

Uprzejmie sprawdź

Dlaczego przetwarzamy nasze pule aplikacji?

jeśli przeglądasz Internet, aby znaleźć powód, dla którego pule aplikacji są skonfigurowane do okresowego automatycznego recyklingu, trudno będzie znaleźć rozsądną odpowiedź, która nie dotyczy problemów z pamięcią. To tak, jakby społeczność ogólnie zaakceptowała fakt, że nasze aplikacje internetowe (lub warstwy usług hostowane w IIS) będą musiały zostać ponownie przetworzone, aby uniknąć problemów z pamięcią.

Zawsze uważałem, że jeśli twój kod wymaga okresowych restartów, aby nadal działał poprawnie, to coś jest wyraźnie nie tak. Gdzieś w kodzie jest błąd i trzeba go naprawić, zamiast od czasu do czasu restartować proces, aby problem „zniknął”.

Naprawdę muszę zacząć koncentrować się bardziej na zarządzaniu pamięcią w .NET i upewnieniu się, że nasze aplikacje będą mogły działać bez problemów.

MSTdev
źródło
3
Jednym z powodów było to, że .NET używa osobnej sterty dla „dużych obiektów” (zwykle 85 KB lub więcej lub coś takiego), która nie jest kompaktowana, gdy pojawia się odśmiecanie (chociaż w .NET 4.5.1 myślę, że dodali opcję kompaktowania LOH), i w ASP.NET podczas renderowania HTML po stronie serwera nie jest rzadkością zobaczyć 85K HTML (szczególnie w przypadku powtarzających się treści, takich jak tabele i siatki), a ten HTML jest w zasadzie w pewnym momencie tylko dużym obiektem String na serwerze, a jeśli kwalifikuje się jako duży obiekt, przyczynia się do fragmentacji sterty dużych obiektów, ostatecznie powodując
wyjątek
0

W oparciu o scenariusz PO (długa inicjalizacja podczas uruchamiania / rozgrzewania), inną rzeczą do sprawdzenia jest limit czasu uruchamiania (sekundy), który ma domyślną wartość 90 sekund. Jeśli inicjalizacja trwa dłużej niż czas uruchamiania, proces roboczy może zostać zakończony.

Aleksiej
źródło