You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

什么原因会导致MemoryCache每2分钟逐出所有缓存条目?

问题根因排查路径(已确认是应用域周期性重启导致MemoryCache清空)

System.Runtime.Caching.MemoryCache的生命周期和站点应用域完全绑定,应用域重启时所有缓存内容都会被销毁,优先从应用域重启的原因入手排查:


1. 优先通过.NET内置属性确认重启原因

在站点Global.asax的Application_End事件中添加日志,直接输出HttpRuntime.ShutdownReason枚举值,该值会明确给出应用域退出的官方原因,常见枚举值包括:

  • ConfigurationChange:配置文件变更
  • IdleTimeout:应用池闲置超时
  • MemoryLimitExceeded:内存超限触发回收
  • UnhealthyIsolation:进程不健康触发回收
  • RuntimeError:未处理异常累积超限

2. 检查IIS应用池配置(Windows Server 2019迁移后配置变更概率最高)

进入IIS管理器找到对应应用池的「高级设置」,检查以下配置项:

  • 【回收>固定时间间隔(分钟)】:确认是否被误设为2,Windows Server 2019部署时如果使用自动化脚本很可能误配置该值,Windows Server 2008默认值为1740分钟
  • 【回收>专用内存限制(KB)】:确认是否设置为3GB左右的阈值,匹配你观察到的内存到2-3GB就触发回收的特征
  • 【进程模型>闲置超时(分钟)】:如果前端负载均衡的健康探测被拦截,IIS会判定站点无访问触发闲置回收,高流量场景建议设为0关闭闲置超时
  • 【CPU>限制操作】:确认是否配置了CPU阈值触发回收的规则
  • 【快速失败保护】:确认是否启用了快速失败保护,且故障阈值设置过低,短时间内少量异常就触发周期性重启
  • 【共享配置】:确认IIS是否启用了共享配置,共享配置的周期性同步也可能触发应用域重启

3. 检查.NET Framework配置项

检查站点根目录web.config和.NET Framework全局配置machine.config(路径:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config):

  • 查看processModel节点的restartTimeLimit、restartRequestsLimit配置:确认是否设置了2分钟/少量请求就触发应用域重启的阈值
  • 查看httpRuntime节点的fcnMode配置:注册表的FCNMode配置可能被web.config中的同名配置覆盖,建议在web.config中显式添加<httpRuntime fcnMode="Disabled" />彻底关闭文件变更监听

4. 排查非应用目录的文件变更触发场景

你配置的FCNMode=1仅禁用站点根目录的文件变更监听,以下目录的变更仍会触发应用域重启:

  • ASP.NET临时编译目录:路径为C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\{站点标识},用Procmon监控该目录是否有周期性的文件写入/删除
  • Bin目录子目录:如果你的Bin目录下存在动态生成的子目录或文件,部分版本的.NET Framework仍会监听该类变更触发重启

5. 排查未处理异常或动态程序集生成逻辑

  • 检查站点错误日志:.NET Framework默认配置下,5分钟内出现10个未处理的顶层异常就会触发应用域重启,确认是否有批量异常每2分钟累积达到阈值
  • 确认是否存在运行时动态编译/生成程序集的逻辑:这类逻辑会不断生成新的程序集加载到应用域,达到数量阈值后.NET会自动重启应用域避免内存泄漏

内容的提问来源于stack exchange,提问作者AngryHacker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:24:04