如何在Azure App Service上禁用ASP.NET Framework应用的Server GC
我来帮你梳理下这个问题——你遇到的情况其实在Azure App Service上托管.NET Framework应用时挺常见的,核心问题是web.config的<gcServer>设置要么位置不对,要么被更高优先级的平台配置覆盖了。下面是具体的排查和解决步骤:
1. 先确认web.config的配置位置是否正确
很多人容易犯的错误是把<gcServer>放在了<system.web>节点下,这是完全无效的。正确的结构必须是在<configuration>根节点下的<runtime>子节点中,示例如下:
<configuration> <runtime> <!-- 必须放在这个位置才会生效 --> <gcServer enabled="false" /> </runtime> <!-- 其他配置节点(比如system.web、system.serviceModel等)放在这里 --> </configuration>
如果你的配置位置不对,调整后先重启应用,再检查GCSettings.IsServerGC的值。
2. 用环境变量强制覆盖平台配置
Azure App Service会根据实例的CPU配置自动设置COMPlus_GCServer环境变量,这个环境变量的优先级比web.config更高,所以即使你在web.config里设了enabled="false",也会被它覆盖。
解决方法很简单:
- 登录Azure门户,找到你的App Service
- 进入配置 -> 应用设置
- 添加一个新的应用设置:
- 名称:
COMPlus_GCServer - 值:
0(0代表禁用Server GC,1代表启用)
- 名称:
- 保存设置,应用会自动重启
重启后再检查GCSettings.IsServerGC,应该会返回false了。
3. 确认应用的平台位数设置
如果你的App Service设置为32位平台(在配置 -> 常规设置里的"平台位数"选项),那么Server GC本身就是不支持的,会自动使用工作站GC。但如果是64位多CPU实例,平台默认会启用Server GC,这时候就必须用上面的环境变量来强制关闭。
额外提示:内存占用的后续排查
关闭Server GC后,工作站GC的内存 footprint应该会明显降低,解决你说的闲置应用内存过高的问题。如果之后还是存在非托管内存占用过高的情况,可能需要进一步排查IIS模块、第三方原生DLL或者WCF的宿主配置,但先解决Server GC的问题是关键第一步。
内容的提问来源于stack exchange,提问作者Suchiman

