IIS7 ASP.NET-Anwendung - 2 identische Apps in 2 identischen App-Pools, 1 reagiert und 1 nicht


12

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 ...


Und die App-Ordner sind byteidentisch?
usr

Ja, nur dreifach überprüft, aber der einzige Unterschied liegt in der web.config, in der der Name des virtuellen Verzeichnisses angegeben ist, unter dem es gehostet wird (und ich habe noch einmal überprüft, dass dies auch der einzige Unterschied war). Jede andere Datei ist byteidentisch. .

Was macht die App, die in einem App-Pool länger dauert? Können Sie VS anhängen und den Debugger anhalten, um ein Profil zu erstellen?
USR

Ich habe VS nicht auf dem Server installiert, da es sich um ein Produktionssystem handelt, aber das scheint mein nächster Stopp zu sein. Ich bin auf halbem Weg, indem ich den Datenzugriffs- und Dateizugriffskomponenten eine sehr ausführliche Protokollierung hinzufüge, da die Ablaufverfolgung, die wir haben, noch nichts Bestimmtes gezeigt hat. Ich werde ein paar mehr Statistiken bekommen und fügen Sie es so schnell wie möglich - ich war optimistisch , dass jemand ähnliche begegnet, so konnte ich diesen Weg zu vermeiden

1
Da Sie das Benutzerprofil laden, scheint dies der Hauptunterschied zwischen diesen App-Pools zu sein. Überprüfen Sie die temporären Speicherorte dieser Benutzer und die Dateischreibberechtigungen. Wenn Sie mit demselben Benutzer eine Verbindung zu einer Datenbank herstellen, überprüfen Sie auch die Berechtigungen für die Datenbank. Es ist nur eine Abfrage erforderlich, um das Zeitlimit für diesen Benutzer zu überschreiten. Testen Sie daher nach Möglichkeit mit derselben Datenbank. Viel Glück!

Antworten:


1

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.


0

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.


0

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.


0

Dies ist nicht die Lösung, aber wir werden darauf hinarbeiten.

  1. Führen Sie IISRESET (während der Wartungszeiten) aus oder beenden Sie das W3WP, das zum nicht reagierenden App-Pool gehört

  2. Anwendung starten

  3. 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

  4. Greifen Sie auf die Dateien mscordacwks.dll und mscorwks.dll unter C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.XXXXX zu

  5. Komprimiere und lade diese Datei irgendwo hoch, wo ich sie herunterladen kann.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.