Was kann ich tun, um sicherzustellen, dass IIS meine Anwendung nicht wiederverwendet?

82

Ich habe eine in IIS gehostete WCF-Dienst-App. Beim Start wird eine sehr teure (in Bezug auf Zeit und CPU) Ressource abgerufen, die als lokaler Cache verwendet werden kann.

Leider scheint IIS den Prozess ziemlich regelmäßig zu recyceln. Daher versuche ich, die Einstellungen im Anwendungspool zu ändern, um sicherzustellen, dass IIS die Anwendung nicht wiederverwendet. Bisher habe ich Folgendes geändert:

  • Intervall unter CPU von 5 auf 0 begrenzen.
  • Inaktivitäts-Timeout unter Prozessmodell von 20 auf 0.
  • Regelmäßiges Zeitintervall unter Recycling von 1740 bis 0.

Wird das reichen? Und ich habe spezielle Fragen zu den Artikeln, die ich geändert habe:

  1. Was bedeutet die Einstellung des Grenzintervalls unter der CPU? Bedeutet dies, dass bei Überschreitung einer bestimmten CPU-Auslastung der Anwendungspool wiederverwendet wird?
  2. Was genau bedeutet "recycelt"? Ist die Anwendung vollständig abgerissen und neu gestartet?
  3. Was ist der Unterschied zwischen "Worker Process Shutdown" und "Application Pool Recycling"? In der Dokumentation zum Inaktivitäts-Timeout unter Prozessmodell wird das Herunterfahren des Arbeitsprozesses beschrieben. Während in den Dokumenten für das regelmäßige Zeitintervall unter "Recycling" über das Recycling des Anwendungspools gesprochen wird. Ich verstehe den Unterschied zwischen den beiden nicht ganz. Ich dachte, die w3wp.exe ist der Arbeitsprozess, der den Anwendungspool ausführt. Kann jemand den Unterschied zur Anwendung zwischen den beiden erklären?

Der Grund für das Vorhandensein von IIS7- und IIS7.5-Tags ist, dass die App in beiden Versionen ausgeführt wird und dass die Antworten zwischen den Versionen gleich sind.

Bild als Referenz: Bildbeschreibung hier eingeben

AngryHacker
quelle
Woher hast du den Screenshot oben mit den Einstellungen für IIS?
Andrew William Ross
Dies ist das Eigenschaftenblatt für den erweiterten App-Pool.
TristanK

Antworten:

105

Recycling

Beim Recycling * startet IIS normalerweise einen neuen Prozess als Container für Ihre Anwendung und übergibt dann den alten an ShutdownTimeLimit, damit er sich von selbst löst, bevor er beendet wird.

* - In der Regel: Siehe DisallowOverlappingRotation / Einstellung "Überlappendes Recycling deaktivieren"

Es ist insofern destruktiv , als der ursprüngliche Prozess und alle seine Statusinformationen verworfen werden. Wenn Sie den Sitzungsstatus außerhalb des Prozesses verwenden (z. B. State Server oder eine Datenbank oder sogar ein Cookie, wenn Ihr Status winzig ist), können Sie dies umgehen.

Es ist jedoch standardmäßig überlappend, was bedeutet, dass die Dauer eines Ausfalls minimiert wird, da der neue Prozess gestartet und an die Anforderungswarteschlange angehängt wird, bevor der alte Prozess mitteilt, dass Sie [ShutdownTimeLimit] Sekunden Zeit haben, um fortzufahren.

die Einstellungen

Zu Ihrer Frage: Alle Einstellungen auf dieser Seite steuern in irgendeiner Weise das Recycling. "Herunterfahren" kann als "proaktives Recycling" bezeichnet werden - wenn der Prozess selbst entscheidet, wann es Zeit ist, und ordnungsgemäß beendet wird.

Reaktives Recycling ist der Ort, an dem WAS ein Problem erkennt und den Prozess durchführt (nachdem ein geeignetes Ersatz-W3WP ​​erstellt wurde).

Hier sind einige Dinge, die zum Recycling der einen oder anderen Form führen können:

  • Ein ISAPI entscheidet, dass es ungesund ist
  • Jedes Modul stürzt ab
  • Leerlauf-Timeout
  • CPU-Begrenzung
  • Anpassen der Eigenschaften des App-Pools
    • als Ihre Mama kann an einem Punkt geschrien haben: „Hör auf Kommissionierung es, oder es wird nie besser!“
  • "Ping" -Fehler * pingt nicht wirklich per se, da es eine Named Pipe verwendet - mehr "Life Detection"
  • Alle Einstellungen im obigen Screenshot

Was ist zu tun:

Allgemein:

  • Deaktivieren Sie Leerlauf-Timeouts . 20 Minuten Inaktivität = Boom! Neuer Prozess bei der nächsten eingehenden Anfrage. Setzen Sie das auf Null.

  • Regelmäßiges Zeitintervall deaktivieren - Der 29-Stunden-Standard wurde von verschiedenen Parteien als "verrückt", "ärgerlich" und "clever" beschrieben. Tatsächlich sind nur zwei davon wahr.

  • Optional können Sie DisallowRotationOnConfigChange aktivieren (oben: Deaktivieren von Reycling für Konfigurationsänderungen ), wenn Sie nicht aufhören können, damit zu spielen. Auf diese Weise können Sie die Einstellungen für den App-Pool ändern, ohne den Arbeitsprozessen sofort mitzuteilen, dass er beendet werden muss. Sie müssen den App-Pool manuell recyceln, damit die Einstellungen wirksam werden. Auf diese Weise können Sie die Einstellungen voreinstellen und sie dann in einem Änderungsfenster über Ihren Recycle-Prozess anwenden.

  • Lassen Sie Ping generell aktiviert . Das ist dein Sicherheitsnetz. Ich habe Leute gesehen, die es ausgeschaltet haben, und dann hängt die Site manchmal auf unbestimmte Zeit, was zu Panik führt. Wenn die Einstellungen für Ihre scheinbar sehr, sehr, sehr langsam reagierende App zu aggressiv sind, setzen Sie sie ein wenig zurück und sehen, was Sie bekommen, anstatt es auszuschalten. (Es sei denn, Sie haben das automatische Absturzdumping für W3WPs über Ihren eigenen Überwachungsprozess eingerichtet.)

Das ist genug, um einen wohlerzogenen Prozess für immer leben zu lassen. Wenn es stirbt, wird es ersetzt. Wenn es hängt, sollte der Ping-Vorgang beendet werden und ein neuer sollte innerhalb von 2 Minuten gestartet werden (standardmäßig; der schlimmste Fall sollte sein: bis zur Ping-Frequenz + Ping-Timeout + Startzeitlimit, bevor die Anforderungen wieder funktionieren).

Die CPU-Begrenzung ist normalerweise nicht interessant, da sie standardmäßig deaktiviert ist und auch so konfiguriert ist, dass sie sowieso nichts tut. Wenn es so konfiguriert wäre, dass der Prozess abgebrochen wird, wäre dies sicher ein Recycling-Auslöser. Lass es aus. Hinweis: In IIS 8.x wird die CPU-Drosselung ebenfalls zu einer Option.

Ein (IIS) AppPool ist keine (.Net) AppDomain (kann jedoch eine oder mehrere enthalten)

Aber ... dann stoßen wir auf .Net-Land und AppDomain-Recycling, was ebenfalls zu einem Zustandsverlust führen kann. (Siehe: https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/ )

Kurzversion, Sie tun dies, indem Sie eine web.config-Datei in Ihrem Inhaltsordner berühren (wieder mit der Auswahl!) Oder indem Sie einen Ordner in diesem Ordner oder eine ASPX-Datei erstellen, oder ... andere Dinge ... und das ist ungefähr destruktiv wie ein App-Pool-Recycling, abzüglich der Startkosten für systemeigenen Code (es handelt sich lediglich um ein Konzept mit verwaltetem Code (.Net), sodass hier nur verwalteter Code vorkommt).

Antivirus kann dies auch auslösen, wenn web.config-Dateien gescannt werden, wodurch eine Änderungsbenachrichtigung ausgelöst wird und ...

TristanK
quelle
2
Warten Sie, warten Sie, warten Sie ... warum sollte das LESEN einer web.config von Antivirus eine Änderungsbenachrichtigung auslösen? Jedes Antivirenprogramm, das eine web.config ohne Grund "berührt", ist trash imho.
Shiv
AV kann nicht nur lesen, sondern auch schreiben - beispielsweise in einen alternativen Datenstrom, in dem die zuletzt zum Scannen einer Datei verwendete Engine-Version aufgezeichnet wird. Wie ein Gedanke.
TristanK
7

Bitte überprüfen,

Warum recyceln wir unsere Anwendungspools?

Wenn Sie im Internet nach dem Grund suchen, warum Anwendungspools so konfiguriert sind, dass sie regelmäßig automatisch wiederverwendet werden, werden Sie kaum eine vernünftige Antwort finden, die sich nicht auf Speicherprobleme bezieht. Es ist, als ob die Community im Allgemeinen die Tatsache akzeptiert hat, dass unsere Webanwendungen (oder in IIS gehosteten Service-Layer) recycelt werden müssen, um Speicherprobleme zu vermeiden.

Ich war immer der Meinung, dass, wenn Ihr Code regelmäßig neu gestartet werden muss, um ordnungsgemäß zu funktionieren, etwas eindeutig nicht stimmt. Ihr Code enthält irgendwo einen Fehler, den Sie beheben müssen, anstatt den Prozess gelegentlich neu zu starten, damit das Problem "verschwindet".

Wir müssen uns wirklich mehr auf die Speicherverwaltung in .NET konzentrieren und sicherstellen, dass unsere Anwendungen weiterhin problemlos ausgeführt werden können.

MSTdev
quelle
3
Ein Grund dafür war, dass .NET einen separaten Heap für 'große Objekte' (normalerweise 85 KB oder mehr oder so) verwendet, der bei der Garbage Collection nicht komprimiert wird (obwohl in .NET 4.5.1 die Option zum Komprimieren des LOH hinzugefügt wurde) In ASP.NET ist es beim Rendern von HTML auf der Serverseite nicht ungewöhnlich, dass 85 KB HTML angezeigt werden (insbesondere bei wiederholten Inhalten wie Tabellen und Rastern). Im Grunde handelt es sich bei diesem HTML an einer Stelle nur um ein großes String-Objekt auf dem Server ein großes Objekt, trägt es zur großen Objekt Heapfragmentierung, schließlich in OutOfMemoryException führt, damit die Recycling
nothingisnecessary
0

Basierend auf dem OP - Szenario (lange Initialisierung beim Start / aufwärmen), ist eine andere Sache zu prüfen , Startzeitlimit (Sekunden) , die einen Standardwert von 90 Sekunden hat. Wenn die Initialisierung länger dauert als das Startzeitlimit, kann der Arbeitsprozess abgebrochen werden.

Alexei
quelle