Aufwärmanfragen zur Leistungsverbesserung konfigurieren

Sie können mithilfe von Aufwärmanfragen die Anfrage- und Antwortlatenz beim Laden des Codes Ihrer Anwendung in eine neue Instanz verringern.

App Engine muss den Anwendungscode häufig in eine neue Instanz laden. Dazu kann es in folgenden Situationen kommen:

  • Sie stellen eine Version der Anwendung noch einmal bereit.
  • Es werden neue Instanzen erstellt, da die Anfragelast die Kapazität der aktuell ausgeführten Instanzen überschreitet.
  • Die zugrunde liegende Infrastruktur oder Hardware wird gewartet oder repariert.

Wenn Sie den Anwendungscode in eine neue Instanz laden, kann dies zu Ladeanfragen führen. Durch diese Ladeanfragen erhöht sich eventuell die Anfragelatenz für Ihre Nutzer. Mithilfe von Aufwärmanfragen lässt sich dies vermeiden. Aufwärmanfragen laden den Anwendungscode in eine neue Instanz, bevor Live-Anfragen diese Instanz erreichen.

Wenn Aufwärmanfragen für Ihre Anwendung aktiviert sind, ermittelt App Engine, wann Ihre Anwendung eine neue Instanz benötigt, und initiiert dann eine Aufwärmanfrage zur Initialisierung einer neuen Instanz. Diese Ermittlung ist jedoch nicht immer erfolgreich. Daher kann es auch dann zu Ladeanfragen kommen, wenn Aufwärmanfragen in Ihrer Anwendung aktiviert sind. Wenn Ihre Anwendung beispielsweise keinen Traffic bedient, ist die erste Anfrage an die Anwendung immer eine Ladeanfrage, keine Aufwärmanfrage.

Aufwärmanfragen werden wie jede andere Anfrage an Ihre App Engine-Anwendung auf die Instanzstunden angerechnet. In den meisten Fällen werden Sie bei aktivierten Aufwärmanfragen keinen Anstieg der Instanzstunden feststellen, da Ihre Anwendung einfach in einer Aufwärmanfrage statt in einer Ladeanfrage initialisiert wird. Zu einem Anstieg der Instanzstunden kann es kommen, wenn Sie mehr Vorgänge ausführen, z. B. ein Pre-Caching im Rahmen einer Aufwärmanfrage. Wenn Sie für min_idle_instances einen Wert größer als 0 festlegen, treten möglicherweise Aufwärmanfragen auf, wenn diese Instanzen zum ersten Mal gestartet werden. Sie bleiben danach aber verfügbar.

Durch die Standardaufwärmanfrage werden alle JAR-Dateien im Speicher indexiert sowie Ihre Anwendung und Filter initialisiert.

Aufwärmanfragen aktivieren

Aufwärmanfragen werden vom App Engine-Planer genutzt, der die automatische Skalierung der Instanzen basierend auf der vom Nutzer festgelegten Konfiguration steuert. In der Java-Laufzeitumgebung von App Engine sind Aufwärmanfragen standardmäßig aktiviert. Daher sendet App Engine GET-Anfragen an /_ah/warmup, sodass Sie nach Bedarf antworten und den Code Ihrer Anwendung initialisieren können. Sie können Aufwärmanfragen mit einer dieser Methoden beantworten:

Mit einem <load-on-startup>-Servlet
Die einfachste Methode zum Bereitstellen einer Aufwärmlogik besteht darin, Ihre eigenen Servlets in der Konfigurationsdatei web.xml als <load-on-startup> zu kennzeichnen.
Mit einem ServletContextListener
Hiermit können Sie eine benutzerdefinierte Logik ausführen, bevor eines Ihrer Servlets durch eine Aufwärm- oder Ladeanfrage erstmalig aufgerufen wird.
Mit einem benutzerdefinierten Aufwärm-Servlet
Hiermit wird die Methode service des Servlets nur während einer Aufwärmanfrage und nicht während Ladeanfragen aufgerufen.

Je nach verwendeter Methode müssen Sie möglicherweise einen eigenen Handler für /_ah/warmup implementieren.

Vorbereitung

Sind Aufwärmanfragen aktiviert, startet der Planer bei Bedarf mehr Instanzen. Der Planer verwendet Aufwärmanfragen zum Starten Ihrer Anwendung. Sie werden daher auch dann Logs angezeigt, wenn Ihre Anwendung diese Aufwärmanfragen nicht verarbeitet.

Die folgende Meldung gibt Aufwärmanfragen in den Logs /_ah/warmup an:

This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application.

Es werden nicht in jedem Fall Aufwärmanfragen aufgerufen. Unter Umständen werden stattdessen Ladeanfragen gesendet, z. B. dann, wenn es sich um die erste gestartete Instanz handelt oder wenn ein abrupter Anstieg des Traffics zu verzeichnen ist. Bei aktivierten Aufwärmanfragen wird jedoch nach Möglichkeit versucht, Anfragen an Instanzen zu senden, für die bereits Aufwärmanfragen ausgeführt wurden.

In Java 8 sind Aufwärmanfragen standardmäßig aktiviert. Fügen Sie zu deren Aktivierung - warmup zur Anweisung inbound_services in appengine-web.xml hinzu. Da Aufwärmanfragen standardmäßig aktiviert sind, müssen Sie sie aber nur dann explizit aktivieren, wenn Sie zuvor eine Anwendung bereitgestellt haben, bei der Aufwärmanfragen in der Datei appengine-web.xml deaktiviert sind. Ist dies der Fall, müssen Sie für <warmup-requests-enabled> den Wert true festlegen und dann die Anwendung wieder bereitstellen.

Mit einem <load-on-startup>-Servlet

Die einfachste Möglichkeit zur Bereitstellung einer Aufwärmlogik besteht darin, Ihre eigenen Servlets in web.xml als <load-on-startup> zu markieren. Mit dieser Methode sind keine Änderungen an Ihrem Anwendungscode erforderlich und alle angegebenen Servlets werden zusammen mit Ihrer Anwendung initialisiert.

Fügen Sie in der Datei web.xml für die Servlets, die Sie beim Start laden möchten, dem Element <servlet> das Element <load-on-startup>1</load-on-startup> hinzu. Beispiel:

<servlet>
  <servlet-name>my-servlet</servlet-name>
  <servlet-class>com.company.MyServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

Mit diesen Zeilen wird die angegebene Servlet-Klasse geladen und die Methode init() des Servlets aufgerufen. Die Aufwärmanfrage initialisiert die angegebenen Servlets, bevor auf Liveanfragen reagiert wird. Wenn keine Aufwärmanfrage vorhanden ist, werden die in <load-on-startup> angegebenen Servlets bei der ersten Anfrage an eine neue Instanz registriert. Dies führt zu einer Ladeanfrage. Wie bereits erwähnt, gibt App Engine unter Umständen nicht jedes Mal eine Aufwärmanfrage aus, wenn Ihre Anwendung eine neue Instanz benötigt.

Mit einem ServletContextListener

Wenn Sie eine benutzerdefinierte Logik haben, die Sie ausführen möchten, bevor eines Ihrer Servlets aufgerufen wird, führen Sie folgende Schritte aus:

  1. Registrieren Sie ServletContextListener in Ihrer web.xml-Datei.

    <listener>
      <listener-class>com.company.MyListener</listener-class>
    </listener>
    
  2. Geben Sie neben dem Servlet und dem Filtercode eine Klasse an:

    public class MyListener implements ServletContextListener {
      public void contextInitialized(ServletContextEvent event) {
        // This will be invoked as part of a warmup request, or
        // the first user request if no warmup request was invoked.
      }
      public void contextDestroyed(ServletContextEvent event) {
        // App Engine does not currently invoke this method.
      }
    }
    

Der ServletContextListener wird bei einer Aufwärmanfrage ausgeführt. Wenn keine Aufwärmanfrage vorhanden ist, wird er bei der ersten Anfrage an eine neue Instanz ausgeführt. Dies kann zu Ladeanfragen führen.

Mit einem benutzerdefinierten Aufwärm-Servlet

Das benutzerdefinierte Aufwärm-Servlet ruft die Methode service des Servlets nur während einer Aufwärmanfrage auf. Wenn Sie eine umfassende Logik in ein benutzerdefiniertes Aufwärm-Servlet einfügen, können Sie längere Ladezeiten bei Ladeanfragen vermeiden.

Zum Erstellen eines benutzerdefinierten Aufwärm-Servlets überschreiben Sie einfach die integrierte Servlet-Definition für _ah_warmup in der web.xml-Datei:

<servlet>
  <servlet-name>_ah_warmup</servlet-name>
  <servlet-class>com.company.MyWarmupServlet</servlet-class>
</servlet>