App Engine generiert Nutzungsberichte zur Leistung und Ressourcennutzung der Anwendung. Nachfolgend werden mögliche Strategien für eine effizientere Verwaltung der Ressourcen aufgeführt. Weitere Informationen finden Sie auf der Preisseite.
Nutzungsberichte ansehen
Bei der Bewertung der Anwendungsleistung sollten Sie überprüfen, wie viele Instanzen von der Anwendung ausgeführt und wie die Ressourcen von der Anwendung verwendet werden.
Dashboard-Nutzungsberichte aufrufen
In den folgenden Abschnitten werden Strategien für das Verwalten von Ressourcen beschrieben.
Dynamische Instanzskalierung verwalten
Latenz verringern
Die Anwendungslatenz hat Einfluss darauf, wie viele Instanzen für die Verarbeitung des Traffics benötigt werden. Wenn die Latenz verringert wird, benötigen Sie weniger Instanzen, um die Anwendung bereitzustellen. Cloud Trace ist ein nützliches Tool, mit dem Sie Daten zur Latenz einsehen und mögliche Änderungen zur Verringerung der Latenz ermitteln können.
Nachdem Sie die Latenz der Anwendung mit Cloud Trace ermittelt haben, können Sie versuchen, die Latenz mit den folgenden Strategien zu reduzieren:
- Caching von Daten erhöhen, auf die häufig zugegriffen wird: Setzen Sie App Engine Memcache ein. Die Einrichtung der Cache-Steuerungsheader der Anwendung kann große Auswirkungen darauf haben, wie effizient die Daten von Servern und Browsern im Cache gespeichert werden. Selbst wenn Daten nur wenige Sekunden im Cache gespeichert werden, kann sich dies darauf auswirken, wie effizient die Anwendung Traffic verarbeitet. Python-Anwendungen sollten außerdem das Caching in der Laufzeit nutzen.
- App Engine Memcache effizienter nutzen: Verwenden Sie Batchaufrufe zum Abrufen, Festlegen, Löschen usw. einer Reihe von Einzelaufrufen. Erwägen Sie ggf. die Verwendung der Memcache Async API.
- Aufgaben für nicht anfragebezogene Funktionen verwenden: Wenn Sie mit der Anwendung Vorgänge ausführen, die außerhalb von nutzerseitigen Anfragen erledigt werden können, platzieren Sie diese Vorgänge in einer Aufgabe. Wenn Sie diese Aufgaben an die Aufgabenwarteschlange senden, anstatt vor dem Zurückgeben von Antworten darauf zu warten, dass sie abgeschlossen werden, kann die Latenzzeit für den Nutzer erheblich reduziert werden. Die Aufgabenwarteschlange ermöglicht viel mehr Kontrolle über die Ausführungsraten und unterstützt Sie dabei, die Last auszugleichen.
- Firestore im Datastore-Modus (Datastore) effizienter nutzen: Weitere Informationen finden Sie weiter unten.
- Mehrere URL-Abrufaufrufe gleichzeitig ausführen:
- Führen Sie mehrere URL-Abrufaufrufe in einem Batch zusammen, anstatt sie einzeln in Nutzeranfragen zu verarbeiten, und führen Sie sie in einer Offlineaufgabe gleichzeitig in einem asynchronen URL-Abruf aus.
- Verwenden Sie die asynchrone URL Fetch API.
- HTTP-Sitzungen asynchron schreiben.
Leistungseinstellungen der automatischen Skalierung anpassen
Die Konfigurationsdatei app.yaml
enthält mehrere Einstellungen, mit denen Sie den Kompromiss zwischen Leistung und Ressourcenauslastung für eine bestimmte Version Ihrer Anwendung steuern können. Eine Liste der verfügbaren Einstellungen für das Autoscaling finden Sie unter Skalierungselemente.
Im Video zu den neuen Planereinstellungen von App Engine sehen Sie die Auswirkungen dieser Einstellungen.
Gleichzeitige Requests in Python aktivieren
Die Instanzen Ihrer Anwendung können mehrere Requests gleichzeitig in Python verarbeiten. Wenn Sie diese Einstellung auswählen, verringert sich die Anzahl der Instanzen, die für die Bereitstellung von Traffic für Ihre Anwendung erforderlich sind. Die Anwendung muss jedoch threadsicher sein, damit dies einwandfrei funktioniert. Erfahren Sie mehr über die Verwendung gleichzeitiger Anfragen durch die Aktivierung von Threadsafe in der Datei app.yaml
.
Einstellungen der Aufgabenwarteschlange konfigurieren
Die Standardeinstellungen für die Aufgabenwarteschlange sind auf Leistung ausgerichtet. Wenn Sie bei diesen Standardeinstellungen mehrere Aufgaben gleichzeitig in eine Warteschlange einreihen, werden wahrscheinlich neue Frontend-Instanzen gestartet. Im Folgenden finden Sie einige Vorschläge zum Optimieren der Aufgabenwarteschlange, um Instanzstunden einzusparen:
- Legen Sie den Header „X-AppEngine-FailFast“ für Aufgaben fest, die nicht latenzabhängig sind. Dieser Header weist den Planer an, Anfragen sofort als fehlgeschlagen einzustufen, wenn eine vorhandene Instanz nicht verfügbar ist. Die Aufgabenwarteschlange wiederholt den Vorgang so lange, bis eine vorhandene Instanz für die Bearbeitung der Anfrage verfügbar ist. Wenn Anfragen mit aktiviertem X-AppEngine-FailFast vorhandene Instanzen belegen, können Anfragen ohne diesen Header möglicherweise weiterhin dazu führen, dass neue Instanzen gestartet werden.
- Wenn Sie den Parameter "rate" auf einen niedrigeren Wert setzen, führt die Aufgabenwarteschlange die Aufgaben langsamer aus.
- Wenn Sie den Parameter "max_concurrent_requests" auf einen niedrigeren Wert setzen, werden weniger Aufgaben gleichzeitig ausgeführt.
Nach Möglichkeit statische Inhalte bereitstellen
Die Bereitstellung statischer Inhalte in Python erfolgt über eine spezielle App Engine-Infrastruktur, die keine Instanzstunden verbraucht. Wenn Sie benutzerdefinierte Header festlegen müssen, verwenden Sie die Blobstore API. Die tatsächliche Bereitstellung der Blob-Antwort verbraucht keine Instanzstunden.
Anwendungsspeicher verwalten
App Engine berechnet die Speicherkosten anhand der Größe der Entitäten in Datastore, der Größe der Datastore-Indexe, der Größe der Aufgaben in der Aufgabenwarteschlange und der Menge der in Blobstore gespeicherten Daten. Sie haben folgende Möglichkeiten, um dafür zu sorgen, dass nur so viele Daten wie nötig gespeichert werden:
- Löschen Sie alle Entitäten oder Blobs, die von der Anwendung nicht mehr benötigt werden.
- Entfernen Sie alle nicht benötigten Indexe, wie weiter unten im Abschnitt Cloud Datastore-Nutzung verwalten beschrieben, um die Speicherkosten für Indexe zu reduzieren.
Datastore-Nutzung verwalten
App Engine berücksichtigt die Anzahl der in Datastore ausgeführten Vorgänge. Im Folgenden finden Sie einige Strategien, mit denen Sie die Nutzung der Datastore-Ressourcen und die Latenz für Anfragen an Datastore reduzieren können:
- Die Anzahl der Schreibvorgänge, die zum Erstellen der einzelnen Entitäten in Ihrem lokalen Datastore erforderlich waren, wird in der Datenansicht der Google Cloud Console angezeigt. Anhand dieser Informationen erhalten Sie eine Übersicht über die Kosten, die mit dem Schreiben jeder Entität verbunden sind. Weitere Informationen zum Auswerten dieser Daten finden Sie unter Kosten für Schreibvorgänge.
- Entfernen Sie alle nicht benötigten Indexe, um die Kosten für das Speichern und Schreiben von Entitäten zu reduzieren. Verwenden Sie die Funktion "Indexe abrufen", um zu sehen, welche Indexe in Ihrer Anwendung festgelegt sind. Auf der Suchseite der Google Cloud Console können Sie sehen, welche Indexe derzeit für Ihre Anwendung bereitgestellt werden.
- Bei der Gestaltung eines Datenmodells können Sie die Abfragen möglicherweise so schreiben, dass benutzerdefinierte Indexe vermieden werden. Informationen dazu, wie Indexe von App Engine generiert werden, finden Sie unter Abfragen und Indexe.
- Ersetzen Sie indexierte Attribute (Standardeinstellung) nach Möglichkeit durch nicht indexierte Attribute (Python). Dadurch wird die Anzahl der Schreibvorgänge im Datastore beim Einfügen einer Entität reduziert. Vorsicht: Sollte es erforderlich sein, das nicht indexierte Attribut später abzufragen, müssen Sie den Code ändern, um die nicht indexierten Attribute wiederzuverwenden. Außerdem müssen Sie einen MapReduce-Vorgang für alle Entitäten ausführen, um sie neu zu platzieren.
- Aufgrund der Verbesserungen des Datastore-Abfrageplaners in den App Engine-Releases 1.5.2 und 1.5.3 benötigen Ihre Abfragen möglicherweise weniger Indexe als zuvor. Sie haben die Möglichkeit, bestimmte benutzerdefinierte Indexe aus Leistungsgründen beizubehalten und andere zu löschen, um die Kosten für das Speichern und Schreiben von Entitäten zu reduzieren.
- Führen Sie eine Neukonfiguration des Datenmodells durch, um Abfragen durch Abrufe nach Schlüssel zu ersetzen. Diese Methode ist kostengünstiger und effizienter.
- Verwenden Sie nach Möglichkeit nur schlüsselbasierte Abfragen anstelle von entitätsbasierten Abfragen.
- Zum Reduzieren der Latenz ersetzen Sie mehrere
get()
-Anweisungen einer Entität durch eineget()
-Batch-Anweisung. - Verwenden Sie für die Paginierung Datastore-Cursors statt Offsets.
- Parallelisieren Sie mehrere Datastore-RPCs über die Async Datastore API.
Hinweis: Kleine Datastore-Vorgänge umfassen Aufrufe zum Zuweisen von Datastore-IDs oder ausschließlich schlüsselbasierte Abfragen. Weitere Informationen zu Kosten finden Sie auf der Seite Preise.
Bandbreite verwalten
Zur Reduzierung der ausgehenden Bandbreite können Sie den entsprechenden Cache-Control
-Header in Ihren Antworten festlegen und angemessene Ablaufzeiten für statische Dateien festlegen. Wenn Sie öffentliche Cache-Control
-Header in dieser Weise verwenden, können Proxyserver und Clientbrowser Antworten für den angegebenen Zeitraum im Cache speichern.
Die Steuerung der eingehenden Bandbreite gestaltet sich schwieriger, da es sich hierbei um die Menge von Daten handelt, die Ihre Nutzer an die Anwendung senden. Sie können jedoch App Engine-Firewallregeln verwenden, um IP-Adressbereiche und Subnetze zuzulassen oder einzuschränken.