22

我有一个 ASP.NET MVC 网站,在 Server Intellect 的共享托管平台上每天获得大约 6500 次点击。我一直在日志中看到应用程序重新启动,但我不知道为什么。

我在这里阅读了 Scott Gu 的文章:http ://weblogs.asp.net/scottgu/archive/2005/12/14/433194.aspx 并实施了该技术,这就是我的日志中显示的内容:

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()

它似乎大约每五分钟发生一次。

还有其他方法可以调试吗?

更新:以下是 Softion 提到的应用程序池设置:

中央处理器

  • 限制:0
  • 限制行动:无行动
  • 限制间隔:5分钟

过程模型

  • 空闲超时:20 分钟
  • Ping 最大响应时间:90 秒
  • 启动时间限制:90 秒

快速故障保护

  • 启用:真
  • 故障间隔:5分钟

回收

  • 私人内存限制:100 MB
  • 常规时间间隔:1740 分钟(29 小时)
  • 请求限制:0
  • 具体时间:无
  • 虚拟内存限制:0
4

4 回答 4

30

您可以通过 HostingEnvironment 轻松获取关机原因。您阅读了 Scott Gu 的文章,但您错过了它的评论。

     var shutdownReason = HostingEnvironment.ShutdownReason;

关闭原因代码

如果原因是 HostingEnvironment,请检查控制回收的 IIS 应用程序池参数。我在每个附近都放了一个红点。查看您自己副本底部帮助框中的说明以获取完整信息。

您可以要求您的提供商为您提供设置所有这些参数的 applicationHost.config 文件。他们在 C:\Windows\System32\inetsrv\config 中找到它。我相信您也可以使用一些 .NET api 来获取它们。

在此处输入图像描述

对于每天 6500 次点击,这是一个非常低的点击率,我打赌“空闲超时”设置为 500 万。

更新(将评论移至此处//jgauffin)

  • CPU 限制 0 = 禁用。
  • 进程模型空闲超时:20 分钟(2000 万没有请求回收您的应用程序)。
  • 启用快速故障保护 (5mn)。您需要知道最大失败次数。如果您的应用程序抛出的异常数量超过了 500 万次,我们将对其进行回收。
  • 私有内存限制:100 MB。是的,您应该配置文件,这是一个下限。
  • 常规时间间隔:1740 分钟(29 小时):每 29 小时循环一次。
  • 请求限制:0(禁用)。
  • 虚拟内存限制:0(禁用)。
  • 启用快速故障保护 (5mn)。您需要最大故障数。如果您的应用程序在 500 万次中抛出超过此异常计数,它会回收。如果它每 500 万次回收,这应该是要检查的事情。辅助工作线程中应该有 0 个未处理的异常。将您的代码包装到那里的 try catch 中。
于 2011-06-05T18:57:19.370 回答
3

重新更新:

要求提供者帮助的设置,但更好地询问有关重启原因的信息,就像我在原始答案中提到的那样,即重启的实际日志条目,就像我在我的原始答案中提到的那样。从那些你可以具体知道触发了什么的人中,我已经看到发生了一个达到不同限制的情况。

你真的必须:

使用真实数量的测试数据分析您的应用程序


我的钱用于达到您的托管服务提供商设置的资源限制。

在没有目标的情况下疯狂优化之前,请联系您的提供商并要求他们为您提供有关重新启动的信息。

典型的回收:

  • 空闲 x 时间 / 比如 15 分钟
  • 超过 x 的内存量 / 比如 200 MB
  • 超过 x % 处理器超过 y 时间 / 比如 70 超过 1 分钟
  • 每日循环

一旦你知道了这个案例,你就必须找出是什么占用了这些资源。为此,您必须使用真实数量的测试数据来分析您的应用程序。知道它是内存还是处理器有助于了解要查找的内容。

于 2011-06-04T04:54:41.537 回答
1

它需要一点了解您的应用程序的功能这里列出了可能导致应用程序重新启动/重置甚至关闭的事情

  • 堆栈溢出异常
  • 内存不足异常
  • 任何导致线程崩溃的未处理异常
  • CodeContracts 在发生违反合同时使用 Environment.FailFast

如果您可以使用附加的调试器重现问题,则异常很容易跟踪,您可以进入 Visual Studio 并在抛出未被用户代码捕获的异常时启用所有异常。它有时会揭示有趣的东西,否则这些东西会被隐藏起来。

于 2011-06-03T19:32:09.953 回答
1

IIS是否设置为频繁回收应用程序池?

应用程序池中是否存在某种失控的内存泄漏?

于 2011-03-16T02:11:34.837 回答