Use warmup requests to avoid request and response latency during the time when your app's code is being loaded to a newly created instance.
App Engine frequently needs to load your app's code into a fresh instance. Loading an instance can happen in the following situations:
- When you redeploy a version of your app.
- When new instances are created due to the load from requests exceeding the capacity of the current set of running instances.
- When maintenance and repairs of the underlying infrastructure or physical hardware occur.
Loading your app's code to a new instance can result in loading requests. Loading requests can result in increased request latency for your users, but you can avoid this latency using warmup requests. Warmup requests load your app's code into a new instance before any live requests reach that instance.
If warmup requests are enabled for your application, App Engine attempts to detect when your application needs a new instance and initiates a warmup request to initialize a new instance. However, these detection attempts do not work in every case. As a result, you might encounter loading requests, even if warmup requests are enabled in your app. For example, if your app is serving no traffic, the first request to the app will always be a loading request, not a warmup request.
Warmup requests use instance hours like any other request to your App Engine application. In most cases where warmup requests are enabled, you won't notice an increase in instance hours because your application is simply initializing in a warmup request instead of a loading request. Your instance hour usage can increase if you decide to do more work, such as pre-caching during a warmup request. If you set a minimum number of idle instances, you might encounter warmup requests when those instances first start, but they will remain available after that time.
Enabling warmup requests
Warmup requests are used by the App Engine
scheduler, which controls the auto scaling of instances based on user-supplied
configuration. With warmup requests enabled, App Engine issues
GET requests to
/_ah/warmup. You can implement handlers for this
request to perform application-specific tasks, such as pre-caching application
The scheduler starts up instances when it determines that more instances are needed. Warmup requests may appear in logs even if they are disabled because the scheduler uses them to start instances.
Note that warmup requests are not guaranteed to be called. In some situations loading requests are sent instead: for example, if the instance is the first one being started up, or if there is a steep ramp-up in traffic. However, there will be a "best effort" attempt to send requests to already warmed-up instances if warmup requests are enabled.
When warmup requests are enabled, the scheduler starts up instances when it determines that more instances are needed. Warmup requests may appear in logs even if they are disabled because the scheduler uses them to start instances.
To enable warmup requests, add the
warmup element under the
directive in your
app.yaml file, for example:
inbound_services: - warmup
Registering your handler
To register your handler, define the script to handle your warmup requests in
app.yaml file. For example:
inbound_services: - warmup handlers: - url: /_ah/warmup script: main.py login: admin
This example registers a handler to listen to warmup requests to the
/_ah/warmup request path with the
Creating your handler
Build any logic that you need to run, into a handler that you map to respond to
/_ah/warmup request path. The following example builds on the previous
import webapp2 class MyWarmUpCode(webapp2.RequestHandler): """ This class handles the warmup request. You should add any code that you need to execute in the `get` method, such as populating caches, and ensure that you return a successful HTTP response. """ def get(self): # Your warmup logic goes here. # Return a successful response to indicate the logic completed. self.response.headers['Content-Type'] = 'text/plain' self.response.write('Warmup successful') # ... application = webapp2.WSGIApplication( [ ('/_ah/warmup', MyWarmUpCode), # Other handlers # ... ] )
The examples above provide a framework to use. Next, decide what logic belongs in your warmup request handlers. You might want to add values into memcache that your application will need. For example, if you build and store a list of the current trending articles for your site, building that list in the warmup and then storing the necessary data in memcache means that when a user request comes in, the application has everything ready to serve and no queries are performed on the user's request for that data, which results in a faster response. Related topics:
- Learn more about Memcache