Leistungstests und Antimuster für Cloudanwendungen

Leistungsbezogene Antimuster, ganz ähnlich wie Entwurfsmuster, sind gängige fehlerhafte Prozesse und Implementierungen innerhalb von Organisationen. Hierbei handelt es sich um gängige Methoden, die wahrscheinlich zu Skalierbarkeitsproblemen führen, wenn eine Anwendung überlastet ist. Das Bewusstsein über solche Methoden kann dabei helfen, die Kommunikation von grundlegenden Konzepten zwischen Softwarepraktikern zu vereinfachen.

Ein häufiges Szenario: Eine Anwendung reagiert während der Leistungstests gut. Dann wird sie in der Produktionsumgebung eingesetzt und beginnt damit, echte Workloads zu verarbeiten. Ab diesem Zeitpunkt wird die Leistung unzureichend – die Anwendung lehnt Benutzeranforderungen ab, bleibt hängen oder gibt Ausnahmen aus. Jetzt sieht sich das Entwicklungsteam mit zwei Fragen konfrontiert:

  • Warum hat sich dieses Verhalten beim Testen nicht gezeigt?
  • Wie beheben wir es?

Die Antwort auf die erste Frage ist einfach. Es ist schwierig, in einer Testumgebung echte Benutzer zusammen mit ihren Verhaltensmuster und dem Umfang an Verarbeitungsaufgaben zu simulieren, den sie ausführen werden. Der einzig wirklich sichere Weg, um zu verstehen, wie sich ein System unter Last verhält, besteht darin, es in der Produktionsumgebung zu beobachten. Verstehen Sie uns nicht falsch: Wir empfehlen nicht, Leistungstests zu überspringen. Leistungstests sind von entscheidender Bedeutung, um Grundwerte für Leistungsmetriken zu erhalten. Sie müssen sich jedoch darauf vorbereiten, Ihr Livesystem zu beobachten und ggf. dort auftretende Leistungsprobleme zu beheben.

Die Antwort auf die zweite Frage – wie lässt sich das Problem beheben? – ist weniger einfach. Hier spielt eine Vielzahl von Faktoren eine Rolle, und zuweilen manifestiert sich ein Problem erst unter bestimmten Umständen. Instrumentierung und Protokollierung sind entscheidend, um die Ursache eines Problems zu finden – aber Sie müssen auch wissen, wonach Sie suchen.

Basierend auf dem Feedback, das wir von Microsoft Azure-Kunden erhalten, haben wir einige der häufigsten Leistungsprobleme ermittelt, die von Kunden in ihren Produktionsumgebungen beobachtet werden. Für jedes Antimuster beschreiben wir, warum das Antimuster typischerweise auftritt, sowie die Symptome des Antimusters und Techniken zum Lösen des Problems. Wir stellen auch Beispielcode bereit, der sowohl das Antimuster als auch die vorgeschlagene Skalierbarkeitslösung veranschaulicht.

Einige dieser Antimuster mögen allzu offensichtlich erscheinen, wenn Sie die Beschreibungen lesen, treten aber häufiger auf, als Sie vielleicht glauben. Manchmal erbt eine Anwendung ein Design, das lokal wunderbar funktioniert hat, sich aber nicht in die Cloud skalieren lässt. Es kann auch passieren, dass eine Anwendung mit einem sehr sauberen Design entworfen wird, sich aber das ein oder andere Antimuster einschleicht, wenn neue Features hinzugefügt werden. Unabhängig von den Gründen – dieser Leitfaden hilft Ihnen dabei, diese Antimuster zu finden und zu beheben.

Katalog mit Antimustern

Hier finden Sie die Liste der Antimuster, die wir identifiziert haben:

Antimuster BESCHREIBUNG
Ausgelastete Datenbank Das Auslagern zu vieler Verarbeitungsprozesse an einen Datenspeicher.
Ausgelastetes Front-End Das Verschieben ressourcenintensiver Tasks in Hintergrundthreads.
Zu viele E/A-Vorgänge Das kontinuierliche Senden vieler kleiner Netzwerkanforderungen.
Irrelevante Abrufe Das Abrufen einer größeren Datenmenge als erforderlich, was zu unnötigen E/A-Vorgängen führt.
Ungeeignete Instanziierung Wiederholtes Erstellen und Zerstören von Objekten, die für die gemeinsame Nutzung und Wiederverwendung entworfen wurden.
Monolithische Persistenz Verwenden des gleichen Datenspeichers für Daten mit sehr unterschiedlichen Nutzungsmustern.
Keine Zwischenspeicherung Daten werden nicht zwischengespeichert.
Noisy Neighbor Ein einzelner Mandant nutzt eine unverhältnismäßig große Menge an Ressourcen.
Wiederholungssturm („Retry Storm“) Zu häufige Wiederholungsversuche von fehlgeschlagenen Anforderungen an einen Server.
Synchrone E/A-Vorgänge Blockieren des aufrufenden Threads, während E/A-Vorgänge abgeschlossen werden.

Nächste Schritte

Weitere Informationen zur Leistungsoptimierung finden Sie unter Leistungsoptimierung für eine verteilte Anwendung.