Iis – How to optimize IIS warmup on servers with many sites? (E.g. staged warmup.)

iisiis-8windows-server-2012

Some of our web servers host quite a few sites. In day-to-day events this has not much effect, as all pages are delivered reasonably fast and the server's resources are well-dimensioned.

However, when the host machine needs to restart (for example for system updates), warming up all sites can take considerable amounts of time – sometimes over an hour before all warmup is completed. Presumably, because over ten sites try to grab CPU time for compilation and loading.

Searching around the web, suggestions for faster warmup revolve around the idea of a server hosting only few sites, but what is a good approach for servers with many of them?

We considered trying to stage warmup, so that no more sites get processed at a given time than the CPU has room for – means that the last site probably is not ready a lot sooner, but the first sites will be there quickly. Already a lot better than the all-or-nothing-like free for all.

Does IIS provide staged warmimg-up on IIS startup?

Best Answer

Precompiling your web sites will significantly reduce the warmup delay, and will also avoid a number of intermittent race conditions that occasionally occur during compilation. You can also configure IIS 8 to preload each web site immediately upon update as well, but if your CPU is overloaded, that may not be a good option. It sounds like you may just need more CPU. From experience, I can tell you that if your CPU goes above about 75% on a 10-minute resolution graph, your users are going to experience unpleasant delays.

See IIS 8.0 Application Initialization for how to configure application preloading.

EDIT: For warmup after a system restart, precompilation is still highly recommended, but there is a different configuration option to startup all the sites before the first request (see reference below). On IIS 8, you may still want to do the application-level startup too (it will hit specific pages, which allows you to warm caches and load dynamic dependencies without having to do that manually in your Application_Start. This type of restart should be done during non-peak load, and multiple servers with a load balancer is generally the way to avoid users being affected by the warmup delay. You don't have to go all pricey with a hardware load balancer, the load balancer built into windows is just fine for small shops. When you are about to start maintenance, you drain the server you're going to restart, wait for requests to finish (for as long as you want), do the maintenance and then restart the server in the load balancer, then repeat for the other server. If your traffic is such that broadcasting it over the network is an issue, you may need a separate dedicated subnet for the web servers or a router that handles ICMP.

See Configure Automatic Startup for an Application Pool (IIS 7) for how to configure automatic application start after a system restart.