Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für die Empfehlung zur Leistungseffizienz der Azure Well-Architected Framework-Checkliste:
| PE:07 | Optimieren Sie Code und Infrastruktur. Verwenden Sie Code, der ausgeführt wird, und stellen Sie sicher, dass die Verantwortlichkeiten auf die Plattform ausgelagert werden. Verwenden Sie Code und Infrastruktur nur für ihren Kernzweck und nur bei Bedarf. |
|---|
In diesem Handbuch werden die Empfehlungen zum Optimieren der Code- und Infrastrukturleistung beschrieben. Um Ihren Code und Ihre Infrastruktur zu optimieren, sollten Sie Ihre Komponenten nur für deren Kernzweck und nur bei Bedarf verwenden. Wenn Sie Code und Infrastruktur überlasten, entstehen unnötige Ressourcenverbrauch, Engpässe und langsame Antworten. Um diese Ineffizienzen auszugleichen, müssen Sie weitere Ressourcen hinzufügen, um dieselben Aufgaben auszuführen.
Definitionen
| Begriff | Definition |
|---|---|
| Konkurrenz | Wenn mehrere Aufgaben oder Prozesse gleichzeitig ausgeführt werden, aber nicht unbedingt gleichzeitig. |
| CPU-Architektur | Die Komponenten und Prinzipien, die sich auf die Funktionsweise des Computers auswirken. |
| Datenkomprimierung | Die Aktion, die Größe von Dateien zu verringern, indem redundante Daten minimiert werden. |
| Heap | Ein Bereich im Arbeitsspeicher, der für Laufzeitspeicherzuweisungen verwendet wird. |
| Speicherleck | Wenn eine Workload den zugewiesenen Speicher nicht freigeben kann, nachdem der Arbeitsspeicher nicht mehr benötigt wird. |
| Parallelität | Wenn mehrere Aufgaben oder Prozesse gleichzeitig ausgeführt werden. |
Durch die Optimierung von Code und Infrastruktur wird der Code und die unterstützende Infrastruktur optimiert, 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 verwenden. Es ist ein Ansatz, der sicherstellt, dass Code und Infrastruktur hauptsächlich 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 zur Kompensation der Codeleistung, z. B. das Hinzufügen zusätzlicher Kapazität anstelle der Adressierung der Quelle. Sie müssen Leistungsprobleme mit der Optimierung beheben. Wenn Sie die Codeleistung optimieren, hilft es, die Nutzung von Systemressourcen zu maximieren, die Reaktionszeit zu verbessern, die Latenz zu verringern und die Benutzererfahrung zu verbessern.
Instrumentieren des Codes
Instrumentierungscode bezieht sich auf die Vorgehensweise beim Hinzufügen von Codeausschnitten oder Bibliotheken zu Code, die Daten sammeln und die Codeleistung während der Laufzeit überwachen. 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 Code-Hot-Pfade erhalten, Leistungsengpässe identifizieren und den Code für eine bessere Leistungseffizienz optimieren.
In einer idealen Umgebung sollten Sie codeanalyse frühzeitig 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 dieser Codeanalyse wie möglich automatisieren. Verwenden Sie dynamische und statische Codeanalysetools, um den manuellen Aufwand zu reduzieren. Denken Sie jedoch daran, dass diese Tests immer noch eine Simulation der Produktion sind. Die Produktion bietet das klare Verständnis der Codeoptimierung.
Kompromiss: Codeüberwachungstools werden wahrscheinlich die Kosten erhöhen.
Identifizieren von heißen Pfaden
Durch die Instrumentierung Ihres Codes können Sie den Ressourcenverbrauch für verschiedene Codepfade messen. Diese Messungen helfen Ihnen, heiße Pfade zu identifizieren. Langsame Pfade haben erhebliche Auswirkungen auf die Leistung und die Ressourcennutzung. Sie sind kritische oder häufig ausgeführte Abschnitte eines Programms, die hohe Leistung und niedrige Latenz erfordern. Gehen Sie wie folgt vor, um Code-Hotpfade zu identifizieren:
Analysieren Sie Laufzeitdaten: Sammeln Sie Laufzeitdaten, und analysieren Sie sie, um Bereiche des Codes zu identifizieren, die erhebliche Ressourcen verbrauchen, z. B. CPU, Arbeitsspeicher oder E/A-Vorgänge. Suchen Sie nach Mustern oder Codeabschnitten, die häufig ausgeführt werden, oder nehmen Sie lange Zeit in Anspruch.
Messen Sie die Leistung: Verwenden Sie Profilerstellungstools oder Leistungstestframeworks, um die Ausführungszeit und den Ressourcenverbrauch verschiedener Codepfade zu messen. Es hilft dabei, Engpässe und Verbesserungsbereiche zu erkennen.
Berücksichtigen Sie Geschäftslogik und Benutzereffekt: Bewerten Sie die Wichtigkeit verschiedener Codepfade basierend auf ihrer Relevanz für die Funktionalität oder kritische Geschäftsvorgänge der Anwendung. Bestimmen Sie, welche Codepfade für die Bereitstellung von Werten für Benutzer oder erfüllen die Leistungsanforderungen von entscheidender Bedeutung sind.
Optimieren der Codelogik
Beim Optimieren der Codelogik geht es darum, die Struktur und den Entwurf von Code so zu verfeinern, dass Aufgaben mit weniger Ressourcen ausgeführt werden. Verbesserte Logik reduziert unnötige Vorgänge. Dadurch wird eine schnellere Ausführung mit weniger Ressourcenverbrauch erzeugt. Sie sollten alle unnötigen Vorgänge innerhalb des Codepfads entfernen, die sich auf die Leistung auswirken können. Priorisieren Sie die Optimierung von heißen Pfaden, um die größten Leistungseffizienzgewinne zu erzielen. Berücksichtigen Sie zum Optimieren der Codelogik die folgenden Strategien:
Entfernen Sie unnötige Funktionsaufrufe: Überprüfen Sie Ihren Code, und identifizieren Sie alle Funktionen, die für die gewünschte Funktionalität nicht wesentlich sind, und wirken sich negativ auf die Leistung aus. Wenn beispielsweise ein Funktionsaufruf eine zuvor im Code abgeschlossene Überprüfung durchführt, können Sie den unnötigen Überprüfungsfunktionsaufruf entfernen.
Minimieren Sie Protokollierungsvorgänge: Die Protokollierung kann für das Debuggen und die Analyse hilfreich sein, aber ü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 Sie Schleifen und Bedingungen: Analysieren Sie Schleifen und Bedingungen im Code, und identifizieren Sie unnötige Iterationen oder Bedingungen, die eliminiert 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 das Verschieben von Berechnungen außerhalb der Schleife oder das Aufheben der Schleife.
Reduzieren Sie unnötige Datenverarbeitung: Überprüfen Sie Ihren Code auf unnötige Datenverarbeitungsvorgänge, z. B. redundante Berechnungen oder Transformationen. Entfernen 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 wie Arrays, verknüpfte Listen, Bäume und Hashtabellen aus. Wählen Sie die beste Datenstruktur für ein bestimmtes Problem aus. Eine geeignete Datenstruktur verbessert die Anwendungsleistung.
Minimieren Sie Netzwerkanforderungen: Wenn Ihr Code netzwerkanforderungen erfordert, minimieren Sie die Anzahl der Anforderungen, und optimieren Sie ihre Nutzung. Batchanforderungen, wenn möglich, und vermeiden Sie unnötige Roundtrips, um die Leistung zu verbessern.
Minimieren Sie Zuordnungen: Identifizieren Sie Bereiche, in denen übermäßige Speicherzuweisung 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.
Verringern Sie die Größe der Datenstruktur: Bewerten Sie die Größe Ihrer Datenstrukturen, z. B. Klassen, und identifizieren Sie Bereiche, in denen die Reduzierung möglich ist. Überprüfen Sie die Datenanforderungen, und beseitigen 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 systemeigene SDKs oder leistungsoptimierte Bibliotheken. Native SDKs sind für die Interaktion mit den Diensten und Ressourcen auf einer Plattform oder innerhalb eines Frameworks konzipiert. Cloud-native SDKs funktionieren beispielsweise besser mit Clouddienstdatenebenen als mit benutzerdefiniertem API-Zugriff. SDKs zeichnen sich durch die Bearbeitung von Netzwerk-Anfragen und die Optimierung von Interaktionen aus. Leistungsoptimierte Bibliotheken wie Math.NET enthalten leistungsoptimierte Funktionen. Wenn Sie die Funktionen entsprechend anwenden, können Sie die Leistung Ihrer Workload verbessern.
Durchschneidende Implementierung: Berücksichtigen Sie die Auswirkungen von querschneidenden 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 Hot Paths erfordert Entwicklerkenntnisse bei der Identifizierung von Codeineffizienzen ist subjektiv und kann hoch qualifizierte Einzelperson sein, die für andere Aufgaben erforderlich ist.
- SDKs bieten Komfort und beseitigen die Komplexität der Interaktion mit APIs. SdKs können jedoch Ihre Steuerelement- 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 ordnungsgemäße Speicherverwaltung verbessert die Codeleistung, da dadurch der Mehraufwand für Arbeitsspeichervorgänge reduziert wird. Die effiziente Speicherauslastung verringert die Latenz, verhindert Systemverlangsamungen oder Abstürze und maximiert den Durchsatz von Rechenaufgaben. Berücksichtigen Sie die folgenden Strategien zum Optimieren der Speicherverwaltung.
Debuggen von Speicherproblemen. Speicherabbilder sind Anwendungsspeichermomentaufnahmen. Sie erfassen den Speicherstatus einer Anwendung zu einem bestimmten Zeitpunkt. Speicherabbilder ermöglichen eine retrospektive Analyse speicherbezogener Probleme. Wählen Sie den geeigneten Speicherabbildtyp basierend auf der Art des Problems aus, das Sie diagnostizieren möchten, und den verfügbaren Ressourcen. Sie sollten Miniaturabbilder für routinemäßiges Debuggen und vollständige Dumps für komplexe, kritische Probleme verwenden. Diese Strategie bietet ein Gleichgewicht zwischen Ressourcennutzung und Diagnosefunktionen. Viele Codehostingdienste unterstützen das Speicherdebugging. Sie sollten Dienste bevorzugen, die die Speicheranalyse für diese Dienste unterstützen, die nicht. Hier sind die grundlegenden Schritte zum Debuggen von Speicherproblemen:
Erfassen Sie Speicherabbilder: 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äßige Arbeitsspeicherauslastung) erfüllt sind. Einige Clouddienste bieten diesen Prozess möglicherweise bereits an.
Analysieren Sie Speicherabbilder: Nachdem Sie die Speicherabbilder gesammelt haben, analysieren Sie sie. Zahlreiche Tools unterstützen Sie bei der Untersuchung dieser Dumps, z. B. WinDbg für Windows-Anwendungen oder GDB für Unix-basierte Systeme.
Identifizieren von Speicherlecks: Konzentrieren Sie sich auf die Identifizierung von Speicherlecks während der Analyse. Speicherverluste treten auf, wenn Ihre Anwendung Arbeitsspeicher zuweist, sie aber nicht freigeben kann, wenn der Arbeitsspeicher nicht mehr benötigt wird. Suchen Sie nach Objekten oder Datenstrukturen, die im Arbeitsspeicher verbleiben, auch wenn sie zugeordnet werden sollen.
Beheben und Testen: Konzentrieren Sie sich beim Identifizieren des problematischen Codes auf die Behebung der Speicherprobleme. Lösungen können das ordnungsgemäße Freigeben von Arbeitsspeicher, das Optimieren von Datenstrukturen oder das ErneuteValuieren von Speicherverwaltungspraktiken umfassen. Vergewissern Sie sich, dass Ihre Lösungen strengen Tests unterzogen werden, um ihre Wirksamkeit zu gewährleisten.
Iterieren und Überwachen: Die Speicherverwaltung ist ein kontinuierlicher Prozess. Überwachen Sie die Speicherauslastung Ihrer Anwendung routinemäßig und bleiben bei der Erfassung von Speicherabbildern in der Produktion erhalten. Überprüfen Sie regelmäßig die Analyse- und Optimierungsphasen, um sicherzustellen, dass Speicherprobleme bei nachfolgenden Codeänderungen nicht wieder angezeigt werden.
Durch die Integration von Speicherabbildanalysen in Ihren Softwareentwicklungslebenszyklus können Sie die Zuverlässigkeit und Effizienz Ihrer Anwendungen verstärken. Es hilft, die Wahrscheinlichkeit von Speicherproblemen in der Produktion zu verringern.
Verringern Sie speicherzuordnungen. Minimieren Sie speicherzuordnungen, um den gesamten Speicherbedarf des Codes zu verringern. Ihre Workload kann den verfügbaren Speicher effizient nutzen. Es ist weniger erforderlich, dass der Garbage Collector nicht genutzten Speicher zurückgibt, und es reduziert die Häufigkeit und Dauer der Garbage Collection-Zyklen. Speicherzuweisungen können kostspielig sein, insbesondere, wenn Sie sie häufig ausführen. Minimieren Sie Speicherzuweisungen, damit der Code schnell und effizient ausgeführt werden kann.
Zwischenspeichern speichern häufig verwendete Daten in der Nähe des Prozessors, wodurch die Leistung verbessert wird. Wenn Sie Speicherzuweisungen minimieren, gibt es weniger Konflikte für Den Cachespeicher, sodass Sie den Cache effektiv nutzen können. Eine hohe Anzahl von Speicherzuweisungen kann die Anwendungsleistung beeinträchtigen und Fehler generieren. Weitere Möglichkeiten zum Minimieren der Speicherzuweisungen sind:
Lokale Variablen: Verwenden Sie lokale Variablen anstelle von globalen Variablen, um den Arbeitsspeicherverbrauch zu minimieren.
Faule Initialisierung: Implementieren Sie eine faule 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 zugeordnet werden.
Objektpooling: Ziehen Sie objektpooling in Betracht, um große Objekte wiederzuverwenden, anstatt sie zu zuordnen und zu ordnen.
Weitere Informationen finden Sie unter Reduzieren der Speicherzuweisungen und des Heaps für große Objekte auf Windows-Systemen.
Parallelität und Parallelität verwenden
Die Verwendung von Parallelität und Parallelität umfasst die Ausführung mehrerer Aufgaben oder Prozesse entweder gleichzeitig oder in überlappender Weise, um die 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, verringert sie die Laufzeit der Anwendung und verringert die Latenz und erhöht die Reaktionszeiten. Parallelität und Parallelität ermöglichen eine effiziente Nutzung von Rechenressourcen wie CPU-Kernen oder verteilten Systemen. Parallelität und Parallelität verteilen die Arbeitsauslastung effektiv auf die Computerressourcen.
Verwenden Sie Parallelität. Parallelität ist die Fähigkeit eines Systems, mehrere Vorgänge oder Prozesse gleichzeitig für mehrere Computerressourcen auszulösen. Parallelität teilt eine Arbeitsauslastung in kleinere Vorgänge auf, die parallel ausgeführt werden. Sie können Parallelität erreichen, indem Sie Techniken wie Multiprozessoren oder verteiltes Computing verwenden. Verteilen Sie Aufgaben über Multicore-Prozessoren hinweg, um die Workloadverwaltung zu optimieren. Optimieren Sie Code, um die CPU-Architektur, Threadingmodelle und Multicore-Prozessoren zu nutzen. Wenn Sie Code parallel ausführen, verbessert sich die Leistung, da die Workload über mehrere Kerne verteilt wird.
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, wodurch die Gesamtleistung verbessert werden kann. Sie können Parallelität implementieren, indem Sie Techniken wie Multithreading verwenden, in denen mehrere Threads gleichzeitig innerhalb eines einzelnen Prozesses ausgeführt werden. Sie können auch eine asynchrone Programmierung verwenden, in der Aufgaben gleichzeitig ausgelöst werden.
Asynchrone Programmierung: Die asynchrone Programmierung ist ein Ansatz zum Auslösen von Aufgaben, ohne den Hauptthread zu blockieren. Die asynchrone Programmierung ermöglicht es einem Programm, Aufgaben auszulösen, während auf lange ausgeführte Vorgänge gewartet wird. Mit asynchroner Programmierung kann das Programm mehrere Aufgaben initiieren und warten, bis sie asynchron abgeschlossen sind. Das Programm muss nicht warten, bis jeder Vorgang abgeschlossen ist, bevor er zum nächsten wechselt.
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
asyncundawaitin Sprachen wie C# zu verwenden. Mit diesen Schlüsselwörtern können Sie asynchrone Methoden definieren. Berücksichtigen Sie bei HTTP-Datenverkehr die Verwendung des asynchronen Request-Reply Musters.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 Task-Based asynchronen Mustern und Event-Based asynchronen 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 (Produzent) und der Verarbeitungskomponente (Consumer) der Workload. Es können mehrere Consumer für eine einzelne Warteschlange vorhanden sein. Wenn die Aufgaben steigen, sollten Sie die Verbraucher skalieren, um die Nachfrage zu erfüllen. Der Produzent platziert Aufgaben in einer Warteschlange. Die Warteschlange speichert die Aufgaben, bis ein Verbraucher über Kapazität verfügt. Eine Warteschleife ist oft die beste Möglichkeit, Arbeit an einen Verarbeitungsdienst zu übergeben, der spitzen Anforderungen angibt. Weitere Informationen finden Sie unter Queue-Based Load Leveling pattern and Storage queues and Service Bus queues.
Verwenden von Verbindungspooling
Verbindungspooling ist die Methode, 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. Durch die Verbindungspooling werden vorhandene Verbindungen wiederverwendet und die Kosten für das Öffnen einer neuen Verbindung für jede Anforderung beseitigt. Die 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 derzeit. Ziel ist es, dass der Verbindungspool neue eingehende Anforderungen schnell verarbeitet.
Grundlegendes zu Grenzwerten für verbindungspooling. 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 eine feste Gruppe von Verbindungen zum Startzeitpunkt einzurichten und diese Verbindungen dann zu verwalten. In vielen Fällen kann eine Standardpoolgröße nur aus wenigen Verbindungen bestehen, die in grundlegenden Testszenarien schnell ausgeführt werden. Ihre Anwendung kann die Standardpoolgröße im Großen ausschöpfen und einen Engpass erstellen. Sie sollten eine Poolgröße einrichten, die der Anzahl der gleichzeitigen Transaktionen zugeordnet ist, die für jede Anwendungsinstanz unterstützt werden.
Testen Sie den Verbindungspool. Jede Datenbank- und Anwendungsplattform hat geringfügig unterschiedliche Anforderungen für die Einrichtung und Verwendung eines Pools. Testen Sie den Verbindungspool, um sicherzustellen, dass er effizient unter Last funktioniert.
Risiko: Das Verbindungspooling kann eine Poolfragmentierung erstellen 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 interaktive Anforderungen von Benutzern weiter verarbeiten. Beispiele für Hintergrundaufträge sind Batchaufträge, prozessorintensive Aufgaben und lange ausgeführte Prozesse, z. B. Workflows. Hintergrundaufgaben sollten die Anwendung nicht blockieren oder zu Inkonsistenzen führen, die aufgrund eines verzögerten Vorgangs auftreten, wenn das System geladen wird. 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, Infrastrukturelemente zu verbessern und anzupassen, um spitzen Betrieb und optimale Nutzung von Ressourcen für eine Workload sicherzustellen. Durch die Feinabstimmung der Infrastruktur können Sie Abfall minimieren, Verzögerungen reduzieren 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, berücksichtigen Sie die folgenden Strategien:
Fügen Sie Nutzungsgrenzwerte hinzu. Sie können Nutzungsbeschränkungen für einige Workloadkomponenten implementieren. Um beispielsweise instabile Pods zu entfernen, können Sie pod CPU- und Speichergrenzwerte 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 Arbeitsauslastung, um das Interaktions-, Abhängigkeits- und Kompatibilitätspotential zu reduzieren. Wenn Sie Ihre Workload vereinfachen, optimieren Sie die Ressourcenauslastung von Arbeitsspeicher, Verarbeitungsleistung und Speicher.
Verringern Sie die Last. Um die Last auf eine Workload zu reduzieren, minimieren Sie den Bedarf an einer 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 bereitstellen. Webanwendungsfirewalls und Gatewayressourcen können Sicherheitsprüfungen verarbeiten. Die folgenden Strategien tragen dazu bei, die Auslastung Ihrer Workload zu verringern:
Mögliche Konsistenz: Übernehmen Sie ein späteres Konsistenzmodell, um die Leistung zu verbessern, indem Daten leicht datiert werden können. Die letztendliche Konsistenz reduziert den sofortigen Bedarf an CPU-Zyklen und Netzwerkbandbreite für konstante Datenaktualisierungen.
Delegieren von Aufgaben: Delegieren Sie Serveraufgaben an Clients oder Zwischenstellen, 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 entladen, reduzieren Sie die Arbeitsauslastung auf Ihren Servern und verbessern die Leistung.
Optimieren Sie das Netzwerk. Um ein Workloadnetzwerk für die Leistung zu optimieren, konfigurieren und optimieren Sie die Netzwerkinfrastruktur. Stellen Sie sicher, dass die Arbeitsauslastung auf höchstem Effizienzniveau ausgeführt werden kann.
Netzwerkprotokolle: Upgrade auf moderne Protokolle wie HTTP/2, wodurch mehrere Anforderungen über eine einzelne Verbindung gesendet werden können. Moderne Protokolle reduzieren den Aufwand für die Einrichtung neuer Verbindungen.
Kompromiss: Moderne Protokolle schließen möglicherweise ältere Clients aus.
Netzwerkchat: Batch-Netzwerkanforderungen zusammen, um die Anzahl der Anforderungen zu reduzieren. Statt mehrere kleine Anforderungen zu erstellen, kombinieren Sie sie in größere 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 einer erhöhten Netzwerkdatenverkehr und langsamer Leistung führen kann.
Statische Daten: Verwenden Sie ein Netzwerk für die Inhaltsübermittlung, um häufig auf statische Inhalte zugegriffen zu werden, die den Benutzern nahe liegen. Wenn Sie Daten zwischenspeichern, muss sie nicht über lange Entfernungen reisen. Die Zwischenspeicherung verbessert die Reaktionszeiten und reduziert den Netzwerkdatenverkehr.
Protokollsammlung: Sammeln und aufbewahren Sie nur die Protokolldaten, die erforderlich sind, um Ihre Anforderungen zu unterstützen. 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 verkleinert die Daten, die eine Seite oder API zurückgibt, und sendet sie an den Browser oder die Client-App zurück. Die Komprimierung optimiert den Netzwerkdatenverkehr, wodurch die Anwendungskommunikation beschleunigt werden kann.
Kompromiss: Die Komprimierung fügt serverseitige und clientseitige Verarbeitung hinzu. Die Anwendung muss Daten komprimieren, senden und dekomprimieren. Multicast-Kommunikation oder Kommunikation mit mehreren Empfängern kann einen Dekomprimierungsaufwand erzeugen. Sie müssen die Leistungsschwankungen vor und nach der Implementierung der Datenkomprimierung testen und messen, um zu ermitteln, ob sie für Ihre Workload geeignet ist. Weitere Informationen finden Sie unter Reaktionskomprimierung in ASP.NET Core.
Azure-Unterstützung
Instrumentierungscode: Azure Monitor Application Insights unterstützt automatische Instrumentierung (Autoinstrumentation) und manuelle Instrumentierung von Anwendungscode. Die automatische Instrumentierung ermöglicht die Telemetrieauflistung, ohne den Code der Anwendung zu berühren. Manuelle Instrumentierung erfordert Codeänderungen, um die Application Insights- oder OpenTelemetry-API zu implementieren. Sie können application Insights Profiler verwenden, um hot paths 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 die Speichernutzung zu analysieren und Speicherverluste zu identifizieren und zu beheben.
Azure App Service verfügt über ein Profiler- und Speicherabbildsammlungs- und Analysefeature. Das AutoHealing-Feature des App-Diensts kann automatisch Speicherabbilder und Profilablaufverfolgungen von .NET- und Java-Apps übernehmen.
Verwendung 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. Für Parallelität unterstützt Dienst-AKS die Bereitstellung containerisierter Anwendungen, wodurch die parallele Verarbeitung verbessert wird.
Azure Batch ist ein cloudbasierter Auftragsplanungsdienst, mit dem Sie paralleles und hochleistungsfähiges Computing ohne Infrastruktureinrichtung aktivieren können. Weitere Informationen finden Sie unter "Hintergrundaufträge".
Optimieren der Infrastrukturleistung: Implementieren Sie Azure Resource Manager-Vorlagen zum Definieren und Bereitstellen der Infrastruktur mithilfe von Code. 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 erleichtern. Sie können Aufgaben in die Warteschlange stellen und sie 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.
Verwandte Links
- AKS
- Intelligente Erkennungsfunktion von Application Insights
- Asynchrones Request-Reply Muster
- Vermeiden von Speicherzuweisungen
- Azure Batch
- Azure-Richtlinie
- Azure-Ressourcen-Manager-Vorlagen
- Azure-SDKs
- Hintergrundaufträge
- Überlegungen zur Skalierung und Leistung von Hintergrundaufträgen
- Komprimieren von Dateidaten
- Komprimieren von HTTP-Inhalten
- Definieren von Pod-CPU- und Speichergrenzwerten
- Event-Based asynchrones Muster
- Virtuelle Java-Computer (VMs)
- Heap für große Objekte
- Poolfragmentierung
- Queue-Based Abgleichsmuster
- Reaktionskomprimierung in ASP.NET Core
- Speicherwarteschlangen und Servicebuswarteschlangen
- Task-Based asynchrones Muster
Leistungsfähigkeitscheckliste
Lesen Sie die vollständigen Empfehlungen.