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:
- 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?
- Co dokładnie oznacza „z recyklingu”? Czy aplikacja jest całkowicie rozebrana i uruchomiona ponownie?
- 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:
Odpowiedzi:
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:
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 ...
źródło
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.
źródło
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.
źródło