Ich habe eine ASP.NET (v4.0) Web-App, die in einem virtuellen Verzeichnis (als Anwendung) installiert ist und in einem eigenen App-Pool gehostet wird. Dies wird für jede Instanz der App (dh pro Kunde) wiederholt.
Die App-Pools sind im integrierten (nicht klassischen) Modus und LoadUserProfile ist auf true gesetzt. Ansonsten Standardeinstellungen.
Jede Instanz verfügt derzeit über eine eigene Kopie des Codes / der Konfiguration und einen eigenen Datenordner (Basisdatei lesen / schreiben).
1 Instanz dieser App läuft einwandfrei (der zum Vergleich verwendete Vorgang dauert ~ 4 Sekunden). Jede zweite Instanz wird langsam ausgeführt (von 10 bis 25 Sekunden für den gleichen Vorgang).
Wenn ich die langsamere Instanz in den "schnellsten" App-Pool verschiebe, wird diese Instanz zum Leben erweckt. Wenn ich die schnellere Instanz in den langsameren App-Pool verschiebe, wird diese Instanz zu einem Crawl verlangsamt.
Die App-Pools wurden zunächst auf die gleiche Weise erstellt - manuell. Ich habe später die Powershell-Kopierroutine verwendet, um eine exakte Kopie des schnelleren App-Pools und immer noch das gleiche Verhalten sicherzustellen. Der Vergleich der apppool.config-Dateien zeigt, dass sie bis auf die Zuweisungen des virtuellen Verzeichnisses identisch sind.
Es gibt keine freigegebenen Ressourcen, die blockiert werden, soweit ich das beurteilen kann, und ich habe das getestet, indem ich den Performant-App-Pool heruntergefahren und neu gestartet habe ... slow ist immer noch langsam, und dann, wenn ich diesen App-Pool neu starte (also geladen) last) es geht noch schneller ...
Antworten:
Um das Problem weiter einzugrenzen, würde ich vorschlagen, Wireshark (oder einen anderen Paketanalysator Ihrer Wahl) auf dem Hostsystem für zwei Sitzungen auszuführen. Ich gehe davon aus, dass jedem App-Pool entweder eine eindeutige IP-Adresse oder ein eindeutiger Port zugewiesen ist.
Ermitteln Sie zunächst Ihre Basisleistung, indem Sie nach dem IP: -Port Ihres schnellen App-Pools filtern. Sehen Sie, wie der Verkehr zur und von der App unter "normalen" Bedingungen aussieht.
Bei der zweiten Ausführung müssen Sie den Datenverkehr aus dem langsamen / nicht reagierenden App-Pool erfassen. Wenn das gesamte Netzwerkrouting und so weiter korrekt ist, sollten Sie wiederholte Anfragen in eine Richtung sehen, am wahrscheinlichsten an die App von woanders, ABER wenn Ihre App viele Anfragen an einen anderen Server stellt, kann Ihr Datenverkehr sein schwer am ausstieg statt am einstieg.
Dieser Test zeigt an, ob das Problem in der App liegt oder ob es sich um TCP / IP-Probleme handelt, die zu einer Zeitüberschreitung bei Anforderungen an die App führen, die auf eine geringe / keine Kommunikation zurückzuführen sind.
Korrelieren Sie die Zeitstempel Ihrer Tests mit den Ereignisprotokollen des Servers und (falls zutreffend) mit den Ablaufverfolgungsprotokollen, und Sie sollten in der Lage sein, das Problem zu identifizieren.
quelle
Die Verfolgung fehlgeschlagener Anforderungen (Failed Request Tracing, FRT) ist das beste Tool, um dies zu ermitteln. Es wird die Pipeline und die Dauer jedes Schritts angezeigt. Das sollte darauf hinweisen, ob es sich um etwas im asp.net-Teil oder um etwas in der IIS-Pipeline selbst handelt.
Erstellen Sie zum Einrichten von FRT über IIS auf Websiteebene eine FRT-Regel mit einem HTTP-Statusbereich von 200 bis 999 und aktivieren Sie FRT (dies ist ein separater Schritt vom Aktionsbereich).
Reproduzieren Sie dann das Problem und überprüfen Sie die generierten Dateien (% SystemDrive% \ inetpub \ logs \ FailedReqLogFiles \ w3svc {siteid}). Öffnen Sie sie im Internet Explorer.
quelle
Wenn IIS über einen längeren Zeitraum ohne ersichtlichen Grund verzögert wird, bedeutet dies in der Regel, dass das Zeitlimit für einen externen Dienst abgelaufen ist. Wenn dies der Fall ist, versucht es einen anderen Ansatz. Im Übrigen gilt dies für nahezu alles unter Windows oder Linux. Der erste Verdacht in diesen Situationen ist für mich immer die Konfiguration der Netzwerknamensauflösung. Es ist schuldig, bis seine Unschuld bewiesen ist.
Kann dies mit einem Benutzer wiederhergestellt werden, der auf eine der doppelten Sites trifft? Es wäre gut zu wissen, was die CPU und die Festplatten tun, wenn Sie die Antwortzeit von 10 bis 20 Sekunden neu erstellen. Wenn während der 10-20 Sekunden nicht viel los ist, sollten Sie Ihre Bindungsnamen und die Namensauflösung auf die gebundenen Namen überprüfen. Wenn die CPU oder die Festplatten wegkauen, müssen Sie herausfinden, welcher Prozess zu hart arbeitet und warum.
Bitte posten Sie Ihre Ergebnisse, ich bin neugierig.
PS Ich würde auch die Namensauflösung und den Zugriff auf alle Authentifizierungsdienste überprüfen, die möglicherweise im Spiel sind. Wenn beispielsweise der Domain-Server konsultiert werden muss, stellen Sie sicher, dass der erste DNS-Server in Ihrer Liste der DNS-Server für die Domain ist.
quelle
Dies ist nicht die Lösung, aber wir werden darauf hinarbeiten.
Führen Sie IISRESET (während der Wartungszeiten) aus oder beenden Sie das W3WP, das zum nicht reagierenden App-Pool gehört
Anwendung starten
Schnappen Sie sich eine Speicherauszugsdatei von W3WP, die zum langsamen App-Pool gehört, obwohl sie nicht reagiert. Verwenden Sie entweder den Prozess-Explorer oder den Task-Manager, um eine Sicherungsdatei zu erstellen
Greifen Sie auf die Dateien mscordacwks.dll und mscorwks.dll unter C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.XXXXX zu
Komprimiere und lade diese Datei irgendwo hoch, wo ich sie herunterladen kann.
quelle