IIS上的ASP.NET应用程序从内存中删除静态资源

时间:2019-07-05 08:28:37

标签: asp.net iis asp.net-web-api

我有一个IIS(Windows 2012R2 / IIS 8.5)上托管的ASP.Net Web应用程序。应用程序不断不断地从内存中丢弃静态资源(即静态类/集合),从而导致随机请求的速度大大降低。

通常在IIS worker进程内存超过900Mb(在开发设置中,总内存为4GB)然后降至350Mb左右时发生。在我们的生产设置中也会发生同样的情况(16Gb内存,应用程序最多消耗1.9GB,然后降至800Mb)

设置

  • Windows 2012 R2
  • IIS 8.5
  • 目标框架:4.7.2
  • 平台目标:X64(我强制将其从X64移至Any CPU,以排除 32位内存限制)。

IIS设置:

  • .Net CLR版本:4.0
  • 启用32位应用程序:错误
  • 启动模式:始终运行
  • 空闲超时:0
  • 空闲超时操作:暂停
  • 私人内存限制:0

因此,如您所见,我几乎排除了所有我能想到的东西。持续下降有什么原因吗? .Net CLR是否应该在内存中保留静态类,而不是随机丢弃它们?还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

您是对的,应用程序池应记录重启事件-但我注意到您并未列出完全禁用重启的功能。

默认情况下,IIS将其应用程序池配置为每29小时(1740分钟)重新启动一次,这意味着它不会在每天的同一时间重新启动,但会重新启动。但是,默认情况下,它应该执行“重叠回收”,在关闭旧实例之前,它会启动一个新实例。

如果这是由重启事件引起的,有两个选项可能会有所帮助:

  1. 通过将“常规时间间隔”设置为0来禁用回收。
  2. 将其保持启用状态,但使用Application Initialization功能适当地预热您​​的应用程序。这是IIS 8的一部分,并且是您可以在7.5中安装的模块。

您已经将启动模式设置为Always Running,但是通过应用初始化模块,您还可以declare a page要求服务器在启动过程中请求预热应用程序:

<system.webServer>
   <applicationInitialization
      doAppInitAfterRestart="true">
      <add initializationPage="/default.aspx" hostName="myhost"/>
   </applicationInitialization>
</system.webServer>