0

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?

Cornelius
  • 123
  • 7
  • Interesting. I've never heard of the term "warming up". – joeqwerty Jan 28 '15 at 17:03
  • It's the term I [came across](https://www.google.co.uk/search?client=opera&q=iis+site+warmup) while researching this. probably relates to warming up of engines and/or caches – Cornelius Jan 28 '15 at 17:14

2 Answers2

1

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.

James
  • 363
  • 2
  • 4
  • 16
  • The "trouble" with buying more CPU is that the problems only occur on boot of the server; in day to day operations the server is well-dimensioned. With reboots only being required every so often I am hoping for strategies to mitigate this rare hit, that avoid oversizing the servers. Thank you for the pointers to look at all the same, though. :) – Cornelius Jan 29 '15 at 11:17
  • Oh, you're talking about warmup after a *system* update. That was not clear at all. It sounded like you were talking about a site update. System updates are much easier to handle, as they are usually scheduled. The same recommendation applies, but there is another setting that controls preloading without waiting for a request. Since system updates can be scheduled, you should be able to do those during off-peak times when not as much CPU is required and delays are not as important. If delays must always be avoided, multiple servers and a load balancer are required anyway. – James Jan 29 '15 at 13:15
  • Oh; you are right. That is not very clear in the question, I updated it. Thank you for pointing this out. :) – Cornelius Jan 29 '15 at 15:20
0

Another thing to consider is to check in the web.config file in each site if the compilation element's attribute "batch" is set to true. MSDN docs

This instructs asp.net to compile all the pages on your sites at once (in batch), which can be very slow. If you set it to false, only pages that get requests will get compiled, only once though. (in addition to upfront compiling of everything in /app_code). So you're trading big upfront compilation process of bunch of pages on a bunch of sites, to occasional one-time compilation of pages that get requested through out the day. This cuts down the the start up times considerably.

Again, pre-compiling, multiple servers/load balancing would be great if there are resources available.

andryuha
  • 297
  • 2
  • 8