Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IIS上的ASP.NET应用程序正在从内存中删除静态资源_Asp.net_Iis_Asp.net Web Api - Fatal编程技术网

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

IIS上的ASP.NET应用程序正在从内存中删除静态资源,asp.net,iis,asp.net-web-api,Asp.net,Iis,Asp.net Web Api,我有一个ASP.Net web应用程序,它托管在IIS(Windows 2012R2/IIS 8.5)上。应用程序不断地从内存中删除静态资源(即静态类/集合),导致随机请求的速度大幅降低 这种情况通常发生在IIS工作进程内存超过约900Mb(在开发设置中,总内存为4GB),然后降至约350Mb时。同样的情况也发生在我们的生产设置上(16Gb内存和应用程序最多消耗1.9GB,然后降至800Mb) 设置: Windows 2012 R2 IIS 8.5 目标框架:4.7.2 平台目标:X64(我强

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

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

设置

  • Windows 2012 R2
  • IIS 8.5
  • 目标框架:4.7.2
  • 平台目标:X64(我强制它从
    任何CPU
    中选择
    X64
    以排除 32位内存限制)
IIS设置:

  • .Net CLR版本:4.0
  • 启用32位应用程序:False
  • 启动模式:始终运行
  • 空闲超时:0
  • 空闲超时操作:挂起
  • 专用内存限制:0

正如你所看到的,我几乎排除了我能想到的一切。持续下降有什么原因吗?Net CLR不应该在内存中保留静态类,而不是随机删除它们吗?还是我遗漏了什么

应用程序池应该记录重启事件,这是对的,但我注意到您没有列出完全禁用重启

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

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

  • 通过将“常规时间间隔”设置为
    0
    来禁用回收
  • 保持启用状态,但使用这些功能正确预热应用程序。这是IIS 8的一部分,是可以在7.5中安装的模块
  • 您已经将启动模式设置为始终运行,但通过应用程序初始化模块,您还可以在启动期间请求服务器预热应用程序:

    <system.webServer>
       <applicationInitialization
          doAppInitAfterRestart="true">
          <add initializationPage="/default.aspx" hostName="myhost"/>
       </applicationInitialization>
    </system.webServer>
    
    
    
    Constant drops,这与池重新启动有关吗?我想如果有一段时间没有请求,IIS只需关闭您的AppDomain。您是否在这个静态字段中存储了大量数据?为什么要在静态字段中存储那么多数据?如果它是某种缓存,为什么不将其存储在redis中(例如)?@BugFinder否,我通过启用池重启日志来确保情况并非如此。同样,在这种情况下,内存应该降到零,而不是减半。@Achilles“同样,在这种情况下,内存应该降到零,而不是减半”-只有在没有泄漏的情况下memory@Achilles,正如您所说,您有日志记录功能-您可以记录事件吗?谢谢,我也禁用了该设置,而且内存刷新太频繁了。我可以在几分钟内触发它,所以情况也不应该如此。应用程序池也会因为其他原因而循环使用-您是否正在将任何文件写入应用程序根目录中的磁盘-这可能会导致IIS重新编译项目,如果您不小心,将强制重新启动(我们已经在日志文件、临时缓存等方面看到了这一点——有一些方法可以提高这一限制)。最后,在web garden模式下运行——您是否更改了“最大工作进程数”从默认的
    1
    ?如果是这样,您将在每个线程运行时创建一组新的静态变量。我们会将日志文件写入磁盘,但它们会转到一个完全独立的路径以避免任何干扰。由于缓存同步的原因,我们目前没有在web garden模式下运行。