Hohe CPU-Auslastung bei ASP.NET zwingt Server in die Knie

Hohe CPU-Auslastung bei ASP.NET zwingt Server in die Knie

Ok, unser neuer Build hat in unregelmäßigen Abständen 100 % CPU-Spitzen auf jedem Server. Über längere Zeiträume reagiert die Site dadurch überhaupt nicht - dies wird zu Spitzenzeiten der Fall sein, wenn sich Leute aus verschiedenen Ländern bei der Site anmelden usw.

Wir haben uns Perfmom, Memory Profiler, CLR Profiler, SQL Profiler, Red Gate Ants Profiler angesehen und Belastungstests in UAT versucht – aber wir können das Problem nicht einmal reproduzieren. Das könnte bedeuten, dass das Problem nur durch Tausende von Benutzern auftritt, die die Live-Site aufrufen.

Ein Muster, das uns aufgefallen ist, besteht darin, dass der neue Code – der fehlerhafte Build – tatsächlich deutlich weniger Threads verwendet.

Wir verwenden Spring auch für IOC – hat das einen guten Ruf?

Um die Sache noch schlimmer zu machen, können wir aufgrund der geschäftlichen Auswirkungen keine Live-Bereitstellung durchführen und das Problem daher nicht auf eine Teilmenge der neuen Funktionen eingrenzen, die wir hinzugefügt haben.

Wir sind wirklich am Boden zerstört. Hat irgendjemand Kampfnarben, die uns vielleicht ein paar Leben retten könnten?

Antwort1

Ich schlage vor, Speicherauszüge zu erstellen und sie in WinDdg mit Sos zu analysieren. Ich habe einige Probleme in unserer Produktion behoben, die ich ohne WinDbg wahrscheinlich nicht diagnostizieren könnte.

Tess Fernandezhat ein tolles Blog, in dem Sie lernen können, wie Sie Speicherauszüge analysieren.

Antwort2

Dies wird typischerweise durch die Bereinigung großer, langlebiger Objekte im GC verursacht (stackoverflow hatte dieses Problem, siehe Link). Speichern Sie viele Objektsammlungen im Cache oder in einer Sitzung?

Angriff von GC

Ich empfehle Ihnen außerdem, einen neuen Produktionsserver zu erstellen und zu konfigurieren, um ihn zu testen. Wenn bei Ihnen zufällige Verrücktheiten auftreten und Sie nicht wissen, warum, und diese nicht reproduzieren können, würde ich die Ursache auf die Hardware oder Konfiguration schieben, nicht auf den Code.

Antwort3

Handelt es sich hierbei um einen virtuellen Server mit gemeinsam genutzten Ressourcen oder um einen physischen Server? Wenn ersteres der Fall ist, könnten Sie vielleicht in Betracht ziehen, diesem Server Ressourcen zuzuweisen. Viel Glück …

Antwort4

Es ist sinnlos, den Fehler ohne die Daten zu erraten. Ja, jemand auf Stackoverflow oder in Ihrem Entwicklungsteam könnte Glück haben, aber das ist einfach schlechtes Engineering, und Sie können keinen Plan aufstellen, wie lange Sie brauchen werden, um jede Vermutung auszuprobieren, und ob sie das Problem überhaupt finden würden.

  1. Du musstReprodas Problem. Jmeter ist aufgrund seiner Breite ein guter Anfang, aber wir können nicht das richtige Tool empfehlen, ohne unsere Architektur zu kennen.
  2. Protokollierungspeziell in Ihrer Anwendungsschicht ist ein Muss. Sie können IIS-Traces für langsame Leistung aktivieren, aber die Muppets bei Microsoft haben es so gemacht, dass Sie nicht den gesamten Pipeline-Fluss erfassen können, wenn er langsam ist. Wenn es so schwierig zu reproduzieren ist, würden Sie wirklich gerne einige Protokolle haben, die Ihnen helfen, es einzugrenzenWodas Problem ist. (also, oh, es passiert immer, wenn wir diese gespeicherte Prozedur aufrufen).

Die 100 % CPU-Auslastung ist insofern etwas verdächtig, als dass es sich wahrscheinlich nicht um I/O handelt (vorausgesetzt, die Datenbank ist eine andere Box, eine langsame Datenbank sollte nicht zu 100 % CPU-Auslastung auf den Webservern führen). Sie müssen näher bei sich selbst suchen.

verwandte Informationen