Empfehlungen zur Optimierung von Code und Infrastruktur

Gilt für die folgende Prüfliste zur Leistungseffizienz von Azure Well-Architected Framework:

PE:07 Optimieren sie Code und Infrastruktur. Verwenden Sie leistungsfähigen Code, und stellen Sie sicher, dass die Verantwortlichkeiten auf die Plattform übertragen werden. Verwenden Sie Code und Infrastruktur nur für ihren Kernzweck und nur bei Bedarf.

In diesem Leitfaden werden die Empfehlungen zur Optimierung der Leistung von Code und Infrastruktur beschrieben. Um Ihren Code und Ihre Infrastruktur zu optimieren, sollten Sie Ihre Komponenten nur für ihren Kernzweck und nur bei Bedarf verwenden. Wenn Sie Code und Infrastruktur überlasten, führt dies zu unnötigem Ressourcenverbrauch, Engpässen und langsamen Antworten. Um diese Ineffizienzen auszugleichen, müssen Sie weitere Ressourcen hinzufügen, um dieselben Aufgaben auszuführen.

Definitionen

Begriff Definition
Parallelität Wenn mehrere Aufgaben oder Prozesse gleichzeitig, aber nicht unbedingt zur gleichen Zeit ausgeführt werden.
CPU-Architektur Die Komponenten und Prinzipien, die sich auf die Funktionsweise des Computers auswirken.
Datenkomprimierung Die Aktion, die Größe von Dateien zu reduzieren, indem redundante Daten minimiert werden.
Heap Ein Bereich im Arbeitsspeicher, der für Die Speicherzuordnungen der Laufzeit verwendet wird.
Arbeitsspeicherverlust Wenn eine Workload den zugewiesenen Arbeitsspeicher nicht mehr freigeben kann, nachdem der Arbeitsspeicher nicht mehr benötigt wird.
Parallelität Wenn mehrere Aufgaben oder Prozesse gleichzeitig ausgeführt werden.

Wichtige Entwurfsstrategien

Die Optimierung von Code und Infrastruktur erfordert eine Optimierung des Codes und der unterstützenden Infrastruktur, um die Leistungseffizienz zu verbessern. Es erfordert leistungsfähigen Code, der Aufgaben schnell ausführt und keine Ressourcen verschwendet. Es erfordert eine gut durchdachte Infrastruktur, die optimiert ist, um unnötige Komplexität zu vermeiden. Eine Workload sollte die inhärenten Funktionen der Plattform nutzen. Dies ist ein Ansatz, der sicherstellt, dass sowohl Code als auch Infrastruktur in erster Linie für ihre Kernzwecke und nur bei Bedarf verwendet werden.

Optimieren der Codeleistung

Um die Codeleistung zu optimieren, ändern Sie Code, um die Ressourcennutzung zu reduzieren, die Laufzeit zu minimieren und die Leistung zu verbessern. Sie können Code ändern, um die Effizienz und Geschwindigkeit eines Softwareprogramms zu verbessern. Maskieren Sie Keine Leistungsprobleme mit Brute Force. Brute Force bedeutet das Hinzufügen von Computeressourcen, um die Codeleistung zu kompensieren, z. B. das Hinzufügen zusätzlicher Kapazität, anstatt die Quelle zu adressieren. Sie müssen Leistungsprobleme mit der Optimierung beheben. Wenn Sie die Codeleistung optimieren, können Sie die Auslastung der Systemressourcen maximieren, die Antwortzeit verbessern, die Latenz verringern und die Benutzererfahrung verbessern.

Instrumentieren des Codes

Instrumentieren von Code bezieht sich auf die Praxis des Hinzufügens von Codeausschnitten oder Bibliotheken zu Code, der Daten sammelt und die Codeleistung während der Laufzeit überwacht. Mit der Codeinstrumentation können Entwickler Informationen zu wichtigen Metriken wie Ressourcenverbrauch (CPU, Arbeitsspeicherauslastung) und Ausführungszeit sammeln. Durch die Instrumentierung von Code können Entwickler Einblicke in heiße Codepfade gewinnen, Leistungsengpässe identifizieren und den Code für eine höhere Leistungseffizienz optimieren.

In einer idealen Umgebung sollten Sie codeanalyse früh im Lebenszyklus der Softwareentwicklung durchführen. Je früher Sie ein Codeproblem abfangen, desto günstiger ist es, es zu beheben. Sie möchten so viel wie möglich von dieser Codeanalyse automatisieren. Verwenden Sie dynamische und statische Codeanalysetools, um den manuellen Aufwand zu reduzieren. Beachten Sie jedoch, dass es sich bei diesem Test immer noch um eine Simulation der Produktion handelt. Die Produktion bietet ein klares Verständnis der Codeoptimierung.

Kompromiss: Codeüberwachungstools werden wahrscheinlich die Kosten erhöhen.

Identifizieren heißer Pfade

Indem Sie Ihren Code instrumentieren, können Sie den Ressourcenverbrauch für verschiedene Codepfade messen. Mithilfe dieser Messungen können Sie heiße Pfade identifizieren. Heiße Pfade haben einen erheblichen Einfluss auf die Leistung und ressourcennutzung. Es handelt sich um kritische oder häufig ausgeführte Abschnitte eines Programms, die eine hohe Leistung und geringe Latenz erfordern. Führen Sie die folgenden Schritte aus, um heiße Codepfade zu identifizieren:

  • Analysieren von Laufzeitdaten: Sammeln Sie Laufzeitdaten, und analysieren Sie diese, um Bereiche des Codes zu identifizieren, die erhebliche Ressourcen verbrauchen, z. B. CPU-, Arbeitsspeicher- oder E/A-Vorgänge. Suchen Sie nach Mustern oder Abschnitten von Code, die häufig ausgeführt werden oder lange dauern.

  • Messen der Leistung: Verwenden Sie Profilerstellungstools oder Leistungstestframeworks, um die Ausführungszeit und den Ressourcenverbrauch verschiedener Codepfade zu messen. Sie hilft dabei, Engpässe und Verbesserungsmöglichkeiten zu identifizieren.

  • Betrachten Sie Geschäftslogik und Benutzereffekt: Bewerten Sie die Bedeutung verschiedener Codepfade basierend auf ihrer Relevanz für die Funktionalität der Anwendung oder kritische Geschäftsvorgänge. Bestimmen Sie, welche Codepfade entscheidend sind, um Benutzern Einen Mehrwert zu bieten oder Leistungsanforderungen zu erfüllen.

Optimieren der Codelogik

Bei der Optimierung der Codelogik geht es darum, die Struktur und den Entwurf von Code zu verfeinern, um Aufgaben mit weniger Ressourcen auszuführen. Eine verbesserte Logik reduziert unnötige Vorgänge. Es ermöglicht eine schnellere Ausführung bei weniger Ressourcenverbrauch. Sie sollten alle unnötigen Vorgänge innerhalb des Codepfads entfernen, die sich auf die Leistung auswirken könnten. Priorisieren Sie die Optimierung heißer Pfade, um die größten Effizienzsteigerungen zu erzielen. Um die Codelogik zu optimieren, berücksichtigen Sie die folgenden Strategien:

  • Entfernen unnötiger Funktionsaufrufe: Überprüfen Sie Ihren Code, und identifizieren Sie alle Funktionen, die für die gewünschte Funktionalität nicht erforderlich sind und sich möglicherweise negativ auf die Leistung auswirken. Wenn beispielsweise ein Funktionsaufruf eine zuvor im Code abgeschlossene Überprüfung ausführt, können Sie den nicht benötigten Überprüfungsfunktionsaufruf entfernen.

  • Minimieren von Protokollierungsvorgängen: Die Protokollierung kann beim Debuggen und Analysieren hilfreich sein, aber eine übermäßige Protokollierung kann sich auf die Leistung auswirken. Bewerten Sie die Notwendigkeit jedes Protokollierungsvorgangs, und entfernen Sie unnötige Protokollierungsaufrufe, die für die Leistungsanalyse nicht wichtig sind.

  • Optimieren von Schleifen und Bedingungen: Analysieren Sie Schleifen und Bedingungen in Ihrem Code, und identifizieren Sie unnötige Iterationen oder Bedingungen, die beseitigt werden können. Die Vereinfachung und Optimierung dieser Strukturen kann die Leistung Ihres Codes verbessern. Minimieren Sie Funktionsaufrufe innerhalb von Schleifen, und vermeiden Sie redundante Berechnungen. Erwägen Sie, Berechnungen außerhalb der Schleife zu verschieben oder die Schleifenaufrollung zu verwenden.

  • Reduzieren unnötiger Datenverarbeitung: Überprüfen Sie Ihren Code auf unnötige Datenverarbeitungsvorgänge, z. B. redundante Berechnungen oder Transformationen. Beseitigen Sie diese unnötigen Vorgänge, um die Effizienz Ihres Codes zu verbessern.

  • Optimieren sie Datenstrukturen. Um Daten effizient zu speichern und abzurufen, wählen Sie geeignete Datenstrukturen aus, z. B. Arrays, verknüpfte Listen, Strukturen und Hashtabellen. Wählen Sie die beste Datenstruktur für ein bestimmtes Problem aus. Eine geeignete Datenstruktur verbessert die Anwendungsleistung.

  • Minimieren von Netzwerkanforderungen: Wenn Ihr Code die Erstellung von Netzwerkanforderungen umfasst, minimieren Sie die Anzahl der Anforderungen, und optimieren Sie deren Nutzung. Batchanforderungen, wenn möglich, und vermeiden Sie unnötige Roundtrips, um die Leistung zu verbessern.

  • Minimieren von Zuordnungen: Identifizieren Sie Bereiche, in denen eine übermäßige Speicherbelegung auftritt. Optimieren Sie den Code, indem Sie unnötige Zuordnungen reduzieren und vorhandene Ressourcen nach Möglichkeit wiederverwenden. Durch die Minimierung von Zuordnungen können Sie die Speichereffizienz und die Gesamtleistung verbessern. Verwenden Sie die entsprechenden Speicherverwaltungs- und Garbage Collection-Strategien für Ihre Programmiersprache.

  • Reduzieren der Größe der Datenstruktur: Bewerten Sie die Größe Ihrer Datenstrukturen, z. B. Klassen, und identifizieren Sie Bereiche, in denen eine Reduzierung möglich ist. Überprüfen Sie die Datenanforderungen, und vermeiden Sie unnötige Felder oder Eigenschaften. Optimieren Sie die Speicherauslastung, indem Sie geeignete Datentypen auswählen und Daten effizient verpacken.

  • Verwenden Sie leistungsoptimierte SDKs und Bibliotheken. Verwenden Sie native SDKs oder leistungsoptimierte Bibliotheken. Native SDKs sind für die Interaktion mit den Diensten und Ressourcen auf einer Plattform oder innerhalb eines Frameworks konzipiert. Cloudnative SDKs funktionieren beispielsweise besser mit Clouddienstdatenebenen als mit benutzerdefiniertem API-Zugriff. SDKs zeichnen sich durch die Verarbeitung von Netzwerkanforderungen und die Optimierung von Interaktionen aus. Leistungsoptimierte Bibliotheken, z. B. Math.NET, enthalten leistungsoptimierte Funktionen. Wenn Sie die Funktionen entsprechend anwenden, können Sie die Leistung Ihrer Workload verbessern.

  • Querschnittsimplementierung: Berücksichtigen Sie die Auswirkungen von übergreifenden Implementierungen, z. B. Middleware oder Tokenprüfungen, und bewerten Sie, ob sie sich negativ auf die Leistung auswirken.

Überprüfen Sie die leistungsspezifischen Empfehlungen für die Programmiersprache, mit der Sie arbeiten. Bewerten Sie Ihren Code anhand dieser Empfehlungen, um Verbesserungsbereiche zu identifizieren.

Kompromisse:

  • Die Optimierung von Code und heißen Pfaden erfordert Entwicklerkenntnisse bei der Identifizierung von Codeineffizienzen ist subjektiv und kann hochqualifizierte Einzelpersonen für andere Aufgaben sein.
  • SDKs bieten Komfort und beseitigen die Komplexität der Interaktion mit APIs. SDKs können jedoch Ihre Steuerungs- und Anpassungsoptionen für benutzerdefinierten Code einschränken.

Optimieren der Speicherverwaltung

Die Optimierung der Speicherverwaltung umfasst die Optimierung der Art und Weise, wie eine Workload Speicherressourcen verwendet, zuordnet und freigibt, um die Effizienz zu verbessern. Die richtige Speicherverwaltung verbessert die Codeleistung, da sie den Mehraufwand für Arbeitsspeichervorgänge reduziert. Eine effiziente Speicherauslastung reduziert die Latenz, verhindert Systemverlangsamungen oder Abstürze und maximiert den Durchsatz von Rechenaufgaben. Berücksichtigen Sie die folgenden Strategien, um die Speicherverwaltung zu optimieren.

Debuggen von Arbeitsspeicherproblemen. Speicherabbilder sind Anwendungsspeichermomentaufnahmen. Sie erfassen den Arbeitsspeicherstatus einer Anwendung zu einem bestimmten Zeitpunkt. Speicherabbilder ermöglichen eine retrospektive Analyse von speicherbezogenen Problemen. Wählen Sie den geeigneten Speicherabbildtyp basierend auf der Art des Problems, das Sie diagnostizieren möchten, und den verfügbaren Ressourcen aus. Sie sollten Miniaturabbilder für das routinemäßige Debuggen und vollständige Speicherabbilder für komplexe, kritische Probleme verwenden. Diese Strategie bietet ein Gleichgewicht zwischen Ressourcennutzung und Diagnosefunktionen. Viele Codehostingdienste unterstützen das Debuggen von Arbeitsspeicher. Sie sollten Dienste, die die Speicheranalyse unterstützen, den Diensten vorziehen, die dies nicht unterstützen. Im Folgenden finden Sie die grundlegenden Schritte zum Debuggen von Speicherproblemen:

  1. Speicherabbilder erfassen: Richten Sie zunächst einen Mechanismus zum Erfassen von Speicherabbildern während der Laufzeit Ihrer Anwendung ein. Die Erfassung kann manuell, automatisch oder ausgelöst werden, wenn bestimmte Bedingungen (z. B. übermäßiger Speicherverbrauch) erfüllt sind. Einige Clouddienste bieten diesen Prozess möglicherweise bereits an.

  2. Analysieren von Speicherabbildern: Nachdem Sie die Speicherabbilder gesammelt haben, analysieren Sie sie. Zahlreiche Tools können Sie bei der Überprüfung dieser Speicherabbilder unterstützen, z. B. WinDbg für Windows-Anwendungen oder GDB für Unix-basierte Systeme.

  3. Identifizieren von Speicherverlusten: Konzentrieren Sie sich auf die Identifizierung von Speicherverlusten während der Analyse. Speicherverluste treten auf, wenn Ihre Anwendung Arbeitsspeicher zuordnet, ihn jedoch nicht freigeben kann, wenn der Arbeitsspeicher nicht mehr benötigt wird. Suchen Sie nach Objekten oder Datenstrukturen, die auch dann im Arbeitsspeicher verbleiben, wenn die Zuordnung aufgehoben werden soll.

  4. Beheben und Testen: Konzentrieren Sie sich beim Identifizieren des problematischen Codes auf die Lösung der Speicherprobleme. Lösungen können die ordnungsgemäße Freigabe von Arbeitsspeicher, das Optimieren von Datenstrukturen oder die Neubewertung von Speicherverwaltungsmethoden umfassen. Bestätigen Sie, dass Ihre Lösungen strengen Tests unterzogen werden, um ihre Wirksamkeit sicherzustellen.

  5. Iterieren und Überwachen: Die Speicherverwaltung ist ein kontinuierlicher Prozess. Überwachen Sie routinemäßig die Speicherauslastung Ihrer Anwendung, und speichern Sie weiterhin Speicherabbilder in der Produktion. Überprüfen Sie die Analyse- und Optimierungsphasen regelmäßig, um sicherzustellen, dass Speicherprobleme nicht bei nachfolgenden Codeänderungen erneut auftreten.

Indem Sie die Speicherabbildanalyse in Ihren Softwareentwicklungslebenszyklus integrieren, können Sie die Zuverlässigkeit und Effizienz Ihrer Anwendungen verbessern. Dies trägt dazu bei, die Wahrscheinlichkeit von Speicherproblemen in der Produktion zu verringern.

Reduzieren sie die Speicherbelegungen. Minimieren Sie die Speicherbelegungen, um den Gesamtspeicherbedarf des Codes zu reduzieren. Ihre Workload kann den verfügbaren Arbeitsspeicher effizient nutzen. Es ist weniger erforderlich, dass der Garbage Collector ungenutzten Arbeitsspeicher freigibt, und es reduziert die Häufigkeit und Dauer von Garbage Collection-Zyklen. Speicherbelegungen können kostspielig sein, insbesondere wenn Sie sie häufig ausführen. Minimieren Sie die Speicherbelegungen, damit der Code schnell und effizient ausgeführt werden kann.

Caches speichern häufig verwendete Daten in der Nähe des Prozessors, wodurch die Leistung verbessert wird. Wenn Sie die Speicherbelegungen minimieren, gibt es weniger Konflikte beim Cachespeicherplatz, sodass Sie den Cache effektiv nutzen können. Eine hohe Anzahl von Speicherbelegungen kann die Anwendungsleistung beeinträchtigen und Fehler generieren. Weitere Möglichkeiten zur Minimierung von Speicherbelegungen sind:

  • Lokale Variablen: Verwenden Sie lokale Variablen anstelle von globalen Variablen, um den Arbeitsspeicherverbrauch zu minimieren.

  • Verzögerte Initialisierung: Implementieren Sie eine verzögerte Initialisierung, um die Erstellung von Objekten oder Ressourcen zu verzögern, bis sie benötigt werden.

  • Puffer: Verwalten Sie Puffer effektiv, um zu vermeiden, dass große Speicherpuffer zugewiesen werden.

  • Objektpooling: Ziehen Sie Objektpooling in Betracht, um große Objekte wiederzuverwenden, anstatt sie zuzuweisen und die Zuordnung aufzugeben.

Weitere Informationen finden Sie unter Reduzieren von Speicherbelegungen und Der große Objektheap auf Windows-Systemen.

Verwenden von Parallelität und Parallelität

Die Verwendung von Parallelität und Parallelität umfasst die gleichzeitige oder überlappende Ausführung mehrerer Aufgaben oder Prozesse, um rechenressourcen effizient zu nutzen. Diese Techniken erhöhen den Gesamtdurchsatz und die Anzahl der Aufgaben, die eine Workload verarbeiten kann. Wenn Sie Aufgaben gleichzeitig oder parallel ausführen, reduziert dies die Laufzeit der Anwendung, verringert die Latenz und erhöht die Antwortzeiten. Parallelität und Parallelität ermöglichen eine effiziente Nutzung von Computingressourcen wie CPU-Kernen oder verteilten Systemen. Parallelität und Parallelität verteilen die Workload effektiv auf die Computingressourcen.

Verwenden Sie Parallelität. Parallelität ist die Fähigkeit eines Systems, gleichzeitig mehrere Aufgaben oder Prozesse auf mehreren Rechenressourcen auszulösen. Parallelität unterteilt eine Workload in kleinere Aufgaben, die parallel ausgeführt werden. Sie können Parallelität erreichen, indem Sie Techniken wie Multiprocessing oder verteiltes Computing verwenden. Verteilen Sie Aufgaben auf Mehrere Kernprozessoren, um die Workloadverwaltung zu optimieren. Optimieren Sie Code, um die Vorteile der CPU-Architektur, Threadingmodelle und Mehrkernprozessoren zu nutzen. Wenn Sie Code parallel ausführen, verbessert sich die Leistung, da die Workload auf mehrere Kerne verteilt ist.

Verwenden Sie Parallelität. Parallelität ist die Fähigkeit eines Systems, mehrere Aufgaben oder Prozesse auszuführen. Parallelität ermöglicht es verschiedenen Teilen eines Programms, unabhängig fortschritte zu machen, was die Gesamtleistung verbessern kann. Sie können Parallelität mithilfe von Techniken wie Multithreading implementieren, bei denen mehrere Threads gleichzeitig innerhalb eines einzelnen Prozesses ausgeführt werden. Sie können auch die asynchrone Programmierung verwenden, bei der Aufgaben gleichzeitig ausgelöst werden.

  • Asynchrone Programmierung: Die asynchrone Programmierung ist ein Ansatz zum Auslösen von Aufgaben, ohne den Standard Thread zu blockieren. Die asynchrone Programmierung ermöglicht es einem Programm, Aufgaben auszulösen, während auf den Abschluss von Vorgängen mit langer Ausführungsdauer gewartet wird. Bei der asynchronen Programmierung kann das Programm mehrere Aufgaben initiieren und warten, bis sie asynchron abgeschlossen sind. Das Programm muss nicht warten, bis jede Aufgabe abgeschlossen ist, bevor es mit dem nächsten Vorgang fortgeht.

    Je nach Programmiersprache und Plattform gibt es viele asynchrone Programmiertechniken und -muster. Ein gängiger Ansatz besteht darin, asynchrone Schlüsselwörter und Konstrukte wie async und awaitin Sprachen wie C# zu verwenden. Mit diesen Schlüsselwörtern können Sie asynchrone Methoden definieren. Erwägen Sie für HTTP-Datenverkehr die Verwendung des Musters Asynchrone Request-Reply.

    Viele Frameworks und Bibliotheken bieten integrierte Unterstützung für die asynchrone Programmierung. Beispielsweise können Sie auf der .NET-Plattform asynchrone Vorgänge mithilfe von Mustern wie taskbasiertem asynchronem Muster und ereignisbasiertem asynchronem Muster implementieren. Die spezifische Implementierung der asynchronen Programmierung variiert je nach Programmiersprache, Plattform und Anforderungen der Anwendung.

  • Warteschlangen: Eine Warteschlange ist ein Speicherpuffer zwischen einer anfordernden Komponente (Producer) und der Verarbeitungskomponente (Consumer) der Workload. Es kann mehrere Consumer für eine einzelne Warteschlange geben. Wenn die Aufgaben zunehmen, sollten Sie die Consumer skalieren, um die Nachfrage zu erfüllen. Der Producer platziert Aufgaben in einer Warteschlange. Die Warteschlange speichert die Aufgaben, bis ein Consumer über Kapazität verfügt. Eine Warteschlange ist häufig die beste Möglichkeit, Arbeit an einen Verarbeitungsdienst zu übergeben, der spitzen Nachfrage hat. Weitere Informationen finden Sie unter Warteschlangenbasiertes Lastenausgleichsmuster und Speicherwarteschlangen und Service Bus-Warteschlangen.

Verbindungspooling verwenden

Verbindungspooling ist die Praxis, etablierte Datenbankverbindungen wiederzuverwenden, anstatt für jede Anforderung eine neue Verbindung zu erstellen. Es kann teuer sein, eine Verbindung mit einer Datenbank herzustellen. Sie müssen eine authentifizierte Netzwerkverbindung mit dem Remotedatenbankserver erstellen. Datenbankverbindungen sind besonders teuer für Anwendungen, die häufig neue Verbindungen öffnen. Beim Verbindungspooling werden vorhandene Verbindungen wiederverwendet und der Aufwand für das Öffnen einer neuen Verbindung für jede Anforderung entfällt. Verbindungspooling reduziert die Verbindungslatenz und ermöglicht einen hohen Datenbankdurchsatz (Transaktionen pro Sekunde) auf dem Server. Sie sollten eine Poolgröße auswählen, die mehr Verbindungen verarbeiten kann, als Sie derzeit haben. Ziel ist es, dass der Verbindungspool neue eingehende Anforderungen schnell verarbeitet.

Grundlegendes zu Grenzwerten für Verbindungspools. Einige Dienste beschränken die Anzahl der Netzwerkverbindungen. Wenn Sie diesen Grenzwert überschreiten, werden Verbindungen möglicherweise verlangsamt oder beendet. Sie können verbindungspooling verwenden, um einen festen Satz von Verbindungen zum Startzeitpunkt herzustellen und diese Verbindungen dann aufrechtzuerhalten. In vielen Fällen kann eine Standardpoolgröße nur aus wenigen Verbindungen bestehen, die in grundlegenden Testszenarien schnell funktionieren. Ihre Anwendung kann die Standardpoolgröße unter der Skalierung aufgebraucht und einen Engpass verursachen. Sie sollten eine Poolgröße einrichten, die der Anzahl gleichzeitiger Transaktionen entspricht, die für jede Anwendung instance unterstützt werden.

Testen Sie den Verbindungspool. Für jede Datenbank- und Anwendungsplattform gelten geringfügig unterschiedliche Anforderungen für das Einrichten und Verwenden eines Pools. Testen Sie Ihren Verbindungspool, um sicherzustellen, dass er unter Last effizient funktioniert.

Risiko: Verbindungspools können zu Einer Fragmentierung des Pools führen und die Leistung beeinträchtigen.

Optimieren von Hintergrundaufträgen

Viele Anwendungen erfordern Hintergrundaufgaben, die unabhängig von der Benutzeroberfläche ausgeführt werden. Die Anwendung kann den Auftrag starten und weiterhin interaktive Anforderungen von Benutzern verarbeiten. Beispiele für Hintergrundaufträge sind Batchaufträge, prozessorintensive Aufgaben und prozesse mit langer Ausführungsdauer, z. B. Workflows. Hintergrundaufgaben sollten die Anwendung nicht blockieren oder zu Inkonsistenzen aufgrund von verzögertem Betrieb führen, wenn das System unter Auslastung steht. Um die Leistung zu verbessern, können Sie Computeinstanzen skalieren, die Hintergrundaufgaben hosten. Weitere Informationen finden Sie unter Hintergrundaufträge und Überlegungen zur Skalierung und Leistung.

Optimieren der Infrastrukturleistung

Die Optimierung der Infrastrukturleistung bedeutet, dass Infrastrukturelemente verbessert und angepasst werden, um spitzen Betrieb und die optimale Nutzung von Ressourcen für eine Workload sicherzustellen. Durch die Optimierung der Infrastruktur können Sie Verschwendung minimieren, Verzögerungen verringern und mit den verfügbaren Ressourcen mehr erreichen. Dadurch wird sichergestellt, dass Workloads zuverlässig und schnell ausgeführt werden, was zu verbesserten Benutzeroberflächen und Kosteneinsparungen führt. Um die Infrastrukturleistung zu optimieren, sollten Sie die folgenden Strategien in Betracht ziehen:

Fügen Sie Nutzungslimits hinzu. Sie können Nutzungslimits für einige Workloadkomponenten implementieren. Um instabile Pods zu entfernen, können Sie beispielsweise Pod-CPU- und Arbeitsspeichergrenzwerte in Azure Kubernetes Service (AKS) definieren. Um die Leistung zu optimieren, können Sie Speichergrenzwerte auf virtuellen Java-Computern (VMs) definieren.

Optimieren Sie die Infrastruktur. Vereinfachen Sie Ihre Workload, um das Potenzial von Interaktions-, Abhängigkeits- und Kompatibilitätsproblemen zu verringern. Wenn Sie Ihre Workload vereinfachen, optimieren Sie die Ressourcenauslastung von Arbeitsspeicher, Verarbeitungsleistung und Speicher.

Verringern Sie die Auslastung. Um die Last für eine Workload zu verringern, minimieren Sie die Anforderungen an eine Anwendung, und ermöglichen Sie ressourcen, ihre primären Aufgaben auszuführen. Es ist beispielsweise üblich, die Ausführung von Sicherheitslösungen in Ihrem Code oder auf einzelnen Computeinstanzen zu vermeiden. Stattdessen sollten Webserver HTTP-Anforderungen verarbeiten. Web Application Firewalls und Gatewayressourcen können Sicherheitsüberprüfungen verarbeiten. Die folgenden Strategien tragen dazu bei, die Last Ihrer Workload zu reduzieren:

  • Letztliche Konsistenz: Verwenden Sie ein Modell für letztliche Konsistenz, um die Leistung zu verbessern, indem Daten leicht veraltet sind. Letztliche Konsistenz reduziert den unmittelbaren Bedarf an CPU-Zyklen und Netzwerkbandbreite für konstante Datenupdates.

  • Delegieren von Aufgaben: Delegieren Sie Serveraufgaben an Clients oder Vermittler, z. B. Suchindizes und Caches. Delegieren Sie Aufgaben wie das Sortieren von Daten, das Filtern von Daten oder das Rendern von Ansichten. Wenn Sie diese Aufgaben auslagern, reduzieren Sie die Workload auf Ihren Servern und verbessern die Leistung.

Optimieren Sie das Netzwerk. Konfigurieren und optimieren Sie die Netzwerkinfrastruktur, um die Leistung eines Workloadnetzwerks zu optimieren. Stellen Sie sicher, dass die Workload mit der höchsten Effizienz betrieben werden kann.

  • Netzwerkprotokolle: Führen Sie ein Upgrade auf moderne Protokolle wie HTTP/2 durch, mit denen mehrere Anforderungen über eine einzelne Verbindung gesendet werden können. Moderne Protokolle reduzieren den Aufwand für das Herstellen neuer Verbindungen.

    Kompromiss: Moderne Protokolle schließen möglicherweise ältere Clients aus.

  • Netzwerkchatigkeit: Batch-Netzwerkanforderungen zusammen, um die Anzahl der Anforderungen zu reduzieren. Anstatt mehrere kleine Anforderungen zu stellen, kombinieren Sie sie in größeren Anforderungen, um den Netzwerkaufwand zu reduzieren.

  • Datenbankabfragen: Stellen Sie sicher, dass Datenbankabfragen nur die erforderlichen Informationen abrufen. Vermeiden Sie das Abrufen großer Mengen unnötiger Daten, was zu einem erhöhten Netzwerkdatenverkehr und einer langsamen Leistung führen kann.

  • Statische Daten: Verwenden Sie ein Inhaltsübermittlungsnetzwerk, um häufig zugegriffene statische Inhalte in der Nähe der Benutzer zwischenzuspeichern. Wenn Sie Daten zwischenspeichern, müssen sie keine langen Entfernungen zurücklegen. Zwischenspeichern verbessert die Antwortzeiten und reduziert den Netzwerkdatenverkehr.

  • Protokollsammlung: Sammeln und aufbewahren Sie nur die Protokolldaten, die zur Unterstützung Ihrer Anforderungen erforderlich sind. Konfigurieren Sie Datensammlungsregeln, und implementieren Sie Entwurfsüberlegungen, um Ihre Log Analytics-Kosten zu optimieren.

  • Datenkomprimierung: Komprimieren und bündeln Sie HTTP-Inhalte und Dateidaten , um eine schnelle Übertragung zwischen Clients und Servern zu ermöglichen. Die Komprimierung verkleinern die Daten, die von einer Seite oder API zurückgegeben werden, und sendet sie zurück an den Browser oder die Client-App. Die Komprimierung optimiert den Netzwerkdatenverkehr, wodurch die Anwendungskommunikation beschleunigt werden kann.

    Kompromiss: Die Komprimierung fügt die serverseitige und clientseitige Verarbeitung hinzu. Die Anwendung muss Daten komprimieren, senden und dekomprimieren. Die Multicastkommunikation oder die Kommunikation mit mehreren Empfängern kann zu einem Dekomprimierungsaufwand führen. Sie müssen die Leistungsschwankungen vor und nach der Implementierung der Datenkomprimierung testen und messen, um festzustellen, ob sie für Ihre Workload geeignet ist. Weitere Informationen finden Sie unter Antwortkomprimierung in ASP.NET Core.

Azure-Erleichterung

Instrumentierungscode: Azure Monitor Application Insights unterstützt die automatische Instrumentierung (autoinstrumentation) und die manuelle Instrumentierung von Anwendungscode. Die automatische Instrumentierung ermöglicht die Telemetrieerfassung, ohne den Code der Anwendung zu berühren. Die manuelle Instrumentierung erfordert Codeänderungen, um die Application Insights- oder OpenTelemetry-API zu implementieren. Sie können Application Insights Profiler verwenden, um heiße Pfade zu optimieren.

Optimieren der Codelogik: Azure bietet SDKs und Bibliotheken für verschiedene Programmiersprachen für die Interaktion mit Azure-Diensten. Verwenden Sie SDKs, um Interaktionen zwischen Anwendungen und Azure-Ressourcen zu vereinfachen. SDKs bieten eine optimale Interaktion mit Azure-Diensten, wodurch die Latenz reduziert und die Effizienz verbessert wird.

Optimieren der Speicherverwaltung: Verwenden Sie die intelligente Erkennungsfunktion von Application Insights , um den Arbeitsspeicherverbrauch zu analysieren und Speicherverlusten zu identifizieren und zu beheben.

Azure App Service verfügt über ein Profilerstellungs- und Speicherabbildsammlungs- und Analysefeature. Das feature App Service automatischesHealing kann automatisch Speicherabbilder und Profilablaufverfolgungen von .NET- und Java-Apps verwenden.

Verwenden von Parallelität und Parallelität: Verschiedene Azure-Dienste bieten einzigartige Unterstützung für Parallelität, z. B. Azure Cosmos DB, Azure Functions und Blob Storage. Aus Gründen der Parallelität unterstützt AKS die Bereitstellung von Containeranwendungen, wodurch die Parallelverarbeitung verbessert wird.

Azure Batch ist ein cloudbasierter Auftragsplanungsdienst, den Sie verwenden können, um paralleles und hochleistungsfähiges Computing zu ermöglichen, ohne dass eine Infrastruktur eingerichtet werden muss. Weitere Informationen finden Sie unter Hintergrundaufträge.

Optimieren der Infrastrukturleistung: Implementieren Sie Azure Resource Manager-Vorlagen, um die Infrastruktur mithilfe von Code zu definieren und bereitzustellen. Verwenden Sie diese Vorlagen, um effiziente, wiederholbare und konsistente Ressourcenbereitstellungen zu implementieren. Azure Policy bietet Governancefunktionen, um sicherzustellen, dass Ressourcenbereitstellungen den bewährten Methoden und Standards der Organisation entsprechen.

Verwenden Sie für die asynchrone Programmierung skalierbare Warteschlangendienste wie Azure Queue Storage und Azure Service Bus, um die asynchrone Programmierung zu vereinfachen. Sie können Aufgaben in die Warteschlange stellen und unabhängig verarbeiten. Um asynchrone Vorgänge zu unterstützen, bietet Azure Marketplace Warteschlangen und Tools von Drittanbietern, die Sie in Azure-Dienste integrieren können.

Prüfliste zur Leistungseffizienz

Weitere Informationen finden Sie im vollständigen Satz von Empfehlungen.