ASP.NET MVC why does my app keep restarting?

Dave Thieben picture Dave Thieben · Mar 16, 2011 · Viewed 9.9k times · Source

I have an ASP.NET MVC website that gets about 6500 hits a day, on a shared hosting platform at Server Intellect. I keep seeing app restarts in the logs and I cannot figure out why.

I've read Scott Gu's article here: http://weblogs.asp.net/scottgu/archive/2005/12/14/433194.aspx and implemented the technique, and here's what shows up in my log:

Application Shutdown: 
_shutDownMessage=HostingEnvironment initiated shutdown 
HostingEnvironment caused shutdown    
_shutDownStack=at
System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)     at 
System.Environment.get_StackTrace()     at 
System.Web.Hosting.HostingEnvironment.InitiateShutdownInternal()     at 
System.Web.Hosting.HostingEnvironment.InitiateShutdown()     at 
System.Web.Hosting.PipelineRuntime.StopProcessing()

It seems to occur about every five minutes.

Are there any other ways to debug this?

UPDATE: Here are the application pool settings mentioned by Softion:

CPU

  • Limit : 0
  • Limit Action : no action
  • Limit Interval : 5 Minutes

Process Model

  • Idle Timeout : 20 Minutes
  • Ping Maximum Response Time : 90 Seconds
  • Startup Time Limit : 90 Seconds

Rapid-Fail Protection

  • Enabled : True
  • Failure Interval : 5 Minutes

Recycling

  • Private Memory Limit : 100 MB
  • Regular Time Interval : 1740 Minutes (29 Hours)
  • Request Limit : 0
  • Specific Times : none
  • Virtual Memory Limit : 0

Answer

Softlion picture Softlion · Jun 5, 2011

You can easily grab the reason of the shutdown by HostingEnvironment. You read Scott Gu article, but you missed its comments.

     var shutdownReason = HostingEnvironment.ShutdownReason;

Shutdown reason codes

If the reason is HostingEnvironment, check the IIS application pool parameters controlling recycling. I've put a red dot near each one. Check the description in the bottom help box in your own copy for full info.

You can ask your provider to give you the applicationHost.config file where all these parameters are set. They find it in C:\Windows\System32\inetsrv\config. I'm sure you can also get them using some .NET api.

enter image description here

For 6500 hits a day, which is a very low hit rate, i'm betting the "Idle time-out" is set to 5mn.

Update (moved comments to here //jgauffin)

  • CPU Limit 0 = disabled.
  • Process Model Idle Timeout : 20 Minutes (20mn without a request recycles your app).
  • Rapid-Fail Protection enabled (5mn). You need to know the maximum failures count. If your app throws more than this exception count in 5mn it will we recycled.
  • Private Memory Limit : 100 MB. Yes you should profile, this is a low limit.
  • Regular Time Interval : 1740 Minutes (29 Hours): it will recycle every 29h.
  • Request Limit : 0 (disabled).
  • Virtual Memory Limit : 0 (disabled).
  • Rapid-Fail Protection enabled (5mn). You need the maximum failures count. If your app throws more than this exception count in 5mn it recycles. If it recycles every 5mn this should be the thing to check. There should be 0 unhandled exception in secondary worker threads. Wrap your code into a try catch there.