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?
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 href="http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-application-initialization"
rel="nofollow noreferrer">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 href="https://msdn.microsoft.com/en-us/library/bb742455.aspx" rel="nofollow
noreferrer">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 href="https://technet.microsoft.com/en-us/library/cc772112(v=WS.10).aspx" rel="nofollow
noreferrer">Configure Automatic Startup for an Application Pool (IIS 7) for
how to configure automatic application start after a system
restart.
Comments
Post a Comment