ASP.NET MVC why does my app keep restarting?

2019-01-30 16:14发布

问题:

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

回答1:

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;

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.

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.


回答2:

re update:

The settings asked to the provider help, but is way better to ask for information on the reason of the restarts like I mentioned on my original answer i.e. the actual log entries of the restarts like I mentioned on my orig answer. From those you can know specifically what was triggered, I've seen happen one hitting different limits.

You really have to:

profile your application with a realistic amount of test data


My money is on hitting resource limits set by your hosting provider.

Before going crazy with optimization without a target, contact your provider and ask them to give you information on the restarts.

Typical recycles:

  • idle x amount of time / like 15 mins
  • more than x amount of memory / like 200 MB
  • more than x % processor over y time / like 70 over 1 minute
  • a daily recycle

Once you know the case, you have to find out what's taking those resources. For this you have to profile your application with a realistic amount of test data. Knowing if it is memory or processor can help on knowing what to look for.



回答3:

Is IIS set to recycle the app pool frequently?

Is there some kind of runaway memory leak in the app pool?



回答4:

It requires a bit of know how on what your app does here's a list of things that can cause the app to restart/reset or even shut down

  • StackOverflowException
  • OutOfMemoryException
  • Any unhandled exception that crashes a thread
  • CodeContracts use Environment.FailFast when a contract violation occurs

Exceptions are quite easy to track if you can reproduce the issue with a debugger attached you can go into Visual Studio and enable all exceptions when they are thrown not caught by user code. It will sometimes reveal intresting stuff that otherwise is hidden away.