Leistungsoptimierung für eine verteilte Anwendung
In dieser Reihe werden nacheinander mehrere Szenarien für Cloudanwendungen beschrieben, um zu veranschaulichen, wie von einem Entwicklungsteam Auslastungstests und Metriken zum Diagnostizieren von Leistungsproblemen verwendet wurden. Diese Artikel basieren auf echten Auslastungstests, die wir bei der Entwicklung von Beispielanwendungen durchgeführt haben. Der Code für die einzelnen Szenarien ist auf GitHub verfügbar.
Szenarien:
Was ist Leistung?
Leistung wird häufig in Bezug auf den Durchsatz, die Antwortzeit und die Verfügbarkeit gemessen. Leistungsziele sollten auf Geschäftsvorgängen basieren. Für kundenorientierte Aufgaben gelten unter Umständen strengere Anforderungen als für betriebsbezogene Aufgaben, z. B. das Erstellen von Berichten.
Definieren Sie ein Servicelevelziel (Service Level Objective, SLO), mit dem Leistungsziele für jede Workload festgelegt werden. Hierfür unterteilen Sie ein Leistungsziel normalerweise in mehrere Key Performance Indicators (KPIs), z. B.:
- Latenz oder Antwortzeit bestimmter Anforderungen
- Anzahl von durchgeführten Anforderungen pro Sekunde
- Rate der Generierung von Ausnahmen durch das System
Leistungsziele sollten explizit über eine Zielauslastung verfügen. Außerdem erhalten auch dann nicht alle Benutzer genau den gleichen Leistungsgrad, wenn diese gleichzeitig auf das System zugreifen und die gleichen Schritte ausführen. Ein Servicelevelziel sollte daher auf Perzentilen basieren.
Ein Beispiel für SLO kann das folgende sein: „Für Clientanforderungen wird bei Auslastungen von bis zu 25.000 Anforderungen/Sekunde innerhalb von 500 ms @ P90 eine Antwort bereitgestellt.“
Zu lösende Probleme bei der Leistungsoptimierung für ein verteiltes System
Es kann besonders aufwändig sein, in einer verteilten Anwendung Leistungsprobleme zu diagnostizieren. Beispiele hierfür sind:
Eine einzelne Geschäftstransaktion oder ein Geschäftsvorgang betrifft normalerweise mehrere Komponenten des Systems. Es kann schwierig sein, sich einen ganzheitlichen Überblick über einen einzelnen Vorgang zu verschaffen.
Der Ressourcenverbrauch wird auf mehrere Knoten verteilt. Um eine einheitliche Ansicht zu erhalten, müssen Sie Protokolle und Metriken an einem zentralen Ort zusammenfassen.
Die Cloud ermöglicht eine elastische Skalierung. Die automatische Skalierung ist ein wichtiges Verfahren zur Verarbeitung von Auslastungsspitzen, aber es kann auch zur Verdeckung von zugrunde liegenden Problemen führen. Darüber hinaus kann es auch schwierig zu ermitteln sein, welche Komponenten wann skaliert werden müssen.
Workloads skalieren häufig nicht über Kerne oder Threads hinweg. Es ist wichtig, die Anforderungen Ihrer Workloads zu verstehen und sich besser optimierte Größen anzusehen. Einige Größen bieten eingeschränkte Kerne und deaktiviertes Hyperthreading, um einkernorientierte und pro Kern lizenzierte Workloads zu verbessern.
Kaskadierende Fehler können zu Folgefehlern führen, die das ursprüngliche Problem verstärken. Es kann daher vorkommen, dass das erste Anzeichen für das Problem in einer anderen Komponente als der Komponente des ursprünglichen Problems zu beobachten ist.
Allgemeine bewährte Methoden
Die Leistungsoptimierung ist gleichermaßen eine Kunst und eine Wissenschaft, aber der wissenschaftliche Anteil kann betont werden, indem ein systematischer Ansatz gewählt wird. Hier sind einige bewährte Methoden angegeben:
Aktivieren von Telemetriedaten zum Erfassen von Metriken Instrumentieren des Codes Halten Sie sich an die bewährten Methoden für die Überwachung. Verwenden Sie die korrelierte Ablaufverfolgung, um alle Schritte einer Transaktion anzeigen zu können.
Überwachen Sie auch die Perzentile 90/95/99, nicht nur den Mittelwert. Der Durchschnittswert kann Ausreißer verdecken. Die Samplingrate für Metriken ist ebenfalls wichtig. Wenn die Samplingrate zu niedrig ist, fallen Spitzen bzw. Ausreißer, die ein Hinweis auf Probleme sein können, ggf. nicht auf.
Kümmern Sie sich jeweils nur um einen Engpass. Stellen Sie eine Hypothese auf, und testen Sie sie, indem Sie jeweils eine Variable ändern. Wenn Sie einen Engpass beseitigt haben, tritt häufig ein anderer Engpass an einer vor- oder nachgelagerten Stelle auf.
Fehler und Wiederholungen können eine große Auswirkung auf die Leistung haben. Wenn Ihnen auffällt, dass eine Drosselung des Systemy aufgrund der Back-End-Dienste besteht, sollten Sie aufskalieren oder versuchen, die Nutzung zu optimieren (indem Sie beispielsweise Datenbankabfragen optimieren).
Suchen Sie nach gängigen Antimustern in Bezug auf die Leistung.
Suchen Sie nach Möglichkeiten, für Parallelität zu sorgen. Zwei häufige Ursachen für Engpässe sind Nachrichtenwarteschlangen und Datenbanken. In beiden Fällen kann das Sharding hilfreich sein. Weitere Informationen finden Sie unter Horizontale, vertikale und funktionale Datenpartitionierung. Suchen Sie nach „heißen“ Partitionen, die ein Hinweis auf unausgeglichene Lese- oder Schreiblasten sein können.
Nächste Schritte
Lesen Sie sich die Informationen zu den Szenarien für die Leistungsoptimierung durch.