【问题标题】:How can I determine why my ASP.NET application is recycling如何确定我的 ASP.NET 应用程序正在回收的原因
【发布时间】:2010-03-09 22:47:20
【问题描述】:

我在 IIS7 服务器上运行 ASP.NET 应用程序。它已经运行了很长时间,但在过去一周左右的时间里,它每天都会丢弃所有用户的会话数次。我启用了http://blogs.iis.net/ganekar/archive/2008/12/12/iis-7-0-application-pool-recycles-log-a-event-in-windows-event-log.aspx 中所述的所有应用程序池回收日志记录选项,但我的事件日志中没有任何内容。

事件日志中没有错误,也没有明显的症状,只是我的所有用户都失去了他们的会话。

IIS 是否有其他原因会回收我的应用程序池?我可以启用任何其他类型的日志记录来了解正在发生的事情吗?

【问题讨论】:

  • 我找到了更多信息。我编写了一个脚本来每小时记录一次 IIS 工作进程 ID。今天早上又出现了session问题,但是我查看日志时,显示进程ID还是一样的。因此,由于工作进程重新启动,这似乎不会发生。
  • 我在服务器上加载了进程监视器,并使用来自weblogs.asp.net/scottgu/archive/2005/12/14/433194.aspx 的指令在每次应用程序结束时写入一个事件日志条目。今天又发生了,记录的消息是“'C:\inetpub\wwwroot\'的目录重命名更改通知。JobTraQ 目录更改或目录重命名。” Process Monitor 显示了很多“NotifyChangeDirectory”事件,但我不知道它们来自哪里。

标签: asp.net iis session


【解决方案1】:

当您遇到此行为时,您最近多久将文件部署到服务器?

在编译标签上有一个讨厌的配置选项,叫做 numRecompilesBeforeAppRestart:

<system.web>
    <compilation debug="true" numRecompilesBeforeAppRestart="15">

http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.numrecompilesbeforeapprestart.aspx

这个值默认为 15。我之前经历过一个应用程序杀死所有用户会话,这对我来说是罪魁祸首。在更新了一个轻度使用的 Web 应用程序后大约一天(将新文件复制到服务器;这最终覆盖了每个文件,数量达到数百个),我们会得到不断的 AppDomain 重新启动,所有用户的所有 Session 值都消失了。

我发现此错误报告列出了我遇到的行为: http://support.microsoft.com/kb/319947

这是与我的场景真正重要的相关文本:

但是,当您 将许多新的 .aspx 或 .ascx 文件加载到 服务器(例如,61 个文件)。 服务器卸载应用程序 重新编译前 15 个文件时 并且每次另外 15 个文件 重新编译直到服务器到达 61. 这会导致四次应用程序重新启动,即使只有一次是 必填。

我将值切换为 99999,问题就消失了。这意味着我的工作进程中会积累更多内存,因此我在 IIS AppPool 回收设置中添加了每日回收(当我的站点没有用户时凌晨 3 点)。

【讨论】:

  • 希望现在它在 SO 上,通过 Google 更容易找到。
  • 那是一篇有趣的文章,但我的问题不同。该错误似乎涉及在大更新后短时间内多次重新启动应用程序。我们的最后一次更新是大约一周前,重启似乎需要更长的时间。
  • “短”是相对的……当它发生在我身上时,它很容易持续一整天,偶尔它会似乎持续更长时间。我们会更新几百个页面,这些页面在很长一段时间内都不会被使用。随着用户探索应用程序的较大部分,应用程序会重新启动。我们会在早上得到一个,然后几个小时后得到另一个,然后在晚上得到另一个。根据更新的大小以及页面和控件的数量,问题可能会持续很长时间。
  • 那么,在您的情况下,只要用户点击自更新以来未点击过的页面,就会触发重新启动?
  • 首先,我的答案是 2 年前写的,行为可能会改变。其次,我很确定 ASP.NET 不会重新编译,除非您更改页面的内容。第三,我认为您需要多页,而不是一页不断变化(请参阅我引用的文本)。第四,查看我上面的链接(指向 MSDN 错误的链接),如果您遇到特定问题,请在 SO 上写一个实际问题或联系 Microsoft。
【解决方案2】:

您可以在元数据库中设置选项以将不同类型的回收事件记录到事件日志中。

对于 IIS 6.0,请参阅http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/87892589-4eda-4003-b4ac-3879eac4bf48.mspx

例如,要启用因超出私有内存限制而导致的回收事件的日志记录,请在您的 Web 服务器上执行此操作:

cd %systemroot%\inetpub\adminscripts
cscript.exe adsutil.vbs set w3svc/AppPools/YOUR_APP_POOL_NAME/AppPoolRecyclePrivateMemory true

这里是 IIS 7.0 的 [不同] 说明的链接:http://technet.microsoft.com/en-us/library/cc771318%28v=ws.10%29.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2015-01-18
    • 2011-01-02
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多