Frage Was muss ich tun, um sicherzustellen, dass IIS meine Anwendung nicht recycelt?


Ich habe eine WCF-Service-App in IIS gehostet. Beim Start geht es und holt eine wirklich teure (in Bezug auf Zeit und CPU) Ressource als lokalen Cache zu verwenden.

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. Bis jetzt habe ich folgendes geändert:

  • Limit Interval unter CPU von 5 bis 0.
  • Idle Timeout unter Prozessmodell von 20 bis 0.
  • Regelmäßiges Zeitintervall unter Recycling von 1740 bis 0.

Wird das genug sein? Und ich habe spezifische Fragen zu den Dingen, die ich geändert habe:

  1. Was genau bedeutet Limit-Intervall-Einstellung unter CPU? Bedeutet dies, dass der Anwendungspool wiederverwendet wird, wenn eine bestimmte CPU-Auslastung überschritten wird?
  2. Was genau bedeutet "recycelt"? Ist die Anwendung komplett abgerissen und neu gestartet?
  3. Was ist der Unterschied zwischen "Worker Process Shutdown" und "Application Pool Recycling"? In der Dokumentation zum Leerlauf-Timeout unter Prozessmodell wird das Herunterfahren des Arbeitsprozesses erläutert. Während die Dokumente für das reguläre Zeitintervall unter Recycling über das Recycling von Anwendungspools sprechen. Ich kann den Unterschied zwischen den beiden nicht ganz unterscheiden. Ich dachte, die w3wp.exe ist der Worker-Prozess, der den Anwendungspool ausführt. Kann jemand den Unterschied zwischen beiden erklären?

Der Grund für die Verwendung von IIS7- und IIS7.5-Tags liegt darin, dass die App in beiden ausgeführt wird und dass die Antworten zwischen den Versionen identisch sind.

Bild als referenz: enter image description here


70
2017-11-22 23:29


Ursprung


Woher hast du diesen Screenshot mit den Einstellungen für IIS? - Andrew William Ross


Antworten:


Recycling

Recycling ist normalerweise *, wo IIS einen neuen Prozess als Container für Ihre Anwendung startet und dann den alten ShutdownTimeLimit ausgibt, um sich selbst zu entfernen, bevor er beendet wird.

* - normalerweise: siehe DisallowOverlappingRotation / Einstellung "Overlapped Recycling deaktivieren"

Es ist destruktiv, dass der ursprüngliche Prozess und alle seine Zustandsinformationen verworfen werden. Wenn Sie einen Out-of-Process-Sitzungsstatus verwenden (z. B. Statusserver oder eine Datenbank oder sogar ein Cookie, wenn Ihr Status winzig ist), können Sie dies umgehen.

Aber es ist standardmäßig überlappt - Dies bedeutet, dass die Dauer eines Ausfalls minimiert wird, da der neue Prozess beginnt und an die Anforderungswarteschlange angeschlossen wird, bevor dem alten mitgeteilt wird, dass Sie [ShutdownTimeLimit] Sekunden haben, um fortzufahren. Bitte befolgen.

die Einstellungen

Zu Ihrer Frage: Alle Einstellungen auf dieser Seite kontrollieren das Recycling in irgendeiner Weise. "Shutdown" kann als "proaktives Recycling" bezeichnet werden - wobei der Prozess selbst entscheidet, dass es Zeit ist zu gehen, und dass er in einer geordneten Weise austritt.

Beim reaktiven Recycling erkennt WAS ein Problem und erschießt den Prozess (nach Herstellung eines geeigneten Ersatz-W3WP).

Nun, hier sind einige Dinge, die das Recycling der einen oder anderen Form verursachen können:

  • ein ISAPI entscheidet, dass es ungesund ist
  • jedes Modul stürzt ab
  • Leerlaufzeitüberschreitung
  • CPU-Begrenzung
  • Anpassen von App-Pool-Eigenschaften
    • als deine Mutter kann habe an einem Punkt geschrien: "Hör auf pflücken oder es wird nie besser werden! "
  • "Ping" -Fehler * kein Ping an sich, da es eine Named Pipe verwendet - mehr "life detection"
  • alle Einstellungen im obigen Screenshot

Was ist zu tun:

Allgemein:

  • Deaktivieren Untätige Timeouts. 20 Minuten Inaktivität = Boom! Neuer Prozess bei der nächsten eingehenden Anfrage Setze das auf Null.

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

  • Optional Anschalten DisallowRotationOnConfigChange (über, Deaktivieren Sie das Rezyklieren für Konfigurationsänderungen) Wenn Sie einfach nicht aufhören können, damit zu spielen - das erlaubt Ihnen, alle App-Pool-Einstellungen zu ändern, ohne dass dies sofort den Arbeitsprozessen signalisiert, dass sie getötet werden müssen. Sie müssen den App-Pool manuell recyceln, damit die Einstellungen wirksam werden. Dadurch können Sie die Einstellungen vorab festlegen und dann mithilfe eines Änderungsfensters über den Recycling-Prozess anwenden.

  • Als allgemeiner Grundsatz, verlassen pingen aktiviert. Das ist dein Sicherheitsnetz. Ich habe gesehen, wie Leute es abschalten, und dann hängt die Seite manchmal auf unbestimmte Zeit, was zu Panik führt ... also, wenn die Einstellungen zu aggressiv für deine anscheinend sehr, sehr langsam reagierende App sind, solltest du sie etwas zurückhalten und sehen Sie, was Sie bekommen, anstatt es abzuschalten. (Es sei denn, Sie haben ein automatisches Crash-Modus-Dumping für hängende W3WPs durch Ihren eigenen Überwachungsprozess eingerichtet)

Das ist genug, um einen wohlerzogenen Prozess zu verursachen, der für immer lebt. Wenn es stirbt, wird es sicher ersetzt. Wenn es aufhört, sollte Ping dies aufheben und ein neues sollte innerhalb von 2 Minuten beginnen (standardmäßig; Worst-Case-Berechnung sollte sein: bis zu Ping-Frequenz + Ping-Zeitüberschreitung + Startzeitlimit bevor Anfragen wieder anfangen zu arbeiten).

CPU-Begrenzung ist nicht normalerweise interessant, weil es standardmäßig ausgeschaltet ist und auch so konfiguriert ist, dass nichts gemacht wird; Wenn es konfiguriert wäre, den Prozess zu beenden, wäre das ein Recycling-Auslöser. Lass es aus. Hinweis für IIS 8.x, CPU-Throttling wird ebenfalls zu einer Option.

Ein (IIS) AppPool ist keine (.Net) AppDomain (kann aber eine / einige enthalten)

Aber ... dann kommen wir in .Net Land, und AppDomain Recycling, das kann auch einen Verlust des Staates verursachen. (Sehen: https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/)

Kurze Version, Sie tun dies durch Berühren einer Datei web.config in Ihrem Inhaltsordner (wieder mit der Auswahl!), Oder durch Erstellen eines Ordners in diesem Ordner oder einer ASPX-Datei, oder .. andere Dinge ... und das ist Über so zerstörerisch wie ein App Pool Recycling, Minus-die nativen Code-Startkosten (es ist ein reines Managed-Code (.Net) -Konzept, also passiert hier nur managed Code-Stuff).

Antivirus kann dies auch beim Scannen von web.config-Dateien auslösen, wodurch eine Änderungsbenachrichtigung verursacht wird, die ... verursacht.


92
2017-11-23 05:07





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 recycelt werden, Sie werden sich schwer tun, eine vernünftige Antwort zu finden, die sich nicht auf Speicherprobleme bezieht. Es ist, als ob die Community im Allgemeinen die Tatsache, dass unsere Web-Anwendungen (oder Service-Layer, die in IIS gehostet werden) müssen recycelt werden, um Speicherprobleme zu vermeiden.

Ich war immer der Meinung, dass Wenn Ihr Code regelmäßig neu gestartet werden muss, damit er ordnungsgemäß funktioniert, ist etwas eindeutig falsch. Es gibt einen Fehler in Ihrem Code irgendwo und Sie müssen das beheben, anstatt den Prozess gelegentlich neu zu starten, um das Problem "weggehen" zu machen.

Wirklich müssen beginnen, sich mehr auf zu konzentrieren Speicherverwaltung in .NET und dafür sorgen, dass unsere Anwendungen ohne Probleme weiterlaufen können.


2
2017-11-19 08:03



Ein Grund war, dass .NET einen separaten Heap für 'große Objekte' (normalerweise 85K oder größer oder etwas) verwendet, der bei der Garbage Collection nicht kompaktiert wird (obwohl in .NET 4.5.1 eine Option zum Komprimieren der LOH hinzugefügt wurde) und in ASP.NET beim Rendern von HTML auf Serverseite ist es nicht ungewöhnlich, 85K HTML zu sehen (insbesondere für wiederholte Inhalte wie Tabellen und Gitter) und dieser HTML ist im Grunde nur ein riesiges String-Objekt auf dem Server, und wenn es als qualifiziert Ein großes Objekt, das zu einer großen Object-Heap-Fragmentierung beiträgt, was schließlich zu OutOfMemoryException führt und somit zu einem Recycling führt - nothingisnecessary


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


0
2017-08-29 07:59