如何在 Azure App Service 上运行的 ASP.NET Framework App 中禁用服务器 GC

Posted

技术标签:

【中文标题】如何在 Azure App Service 上运行的 ASP.NET Framework App 中禁用服务器 GC【英文标题】:How to disable Server GC in ASP.NET Framework App running on Azure App Service 【发布时间】:2020-06-12 11:47:27 【问题描述】:

我正在 Azure 应用服务上对 ASP.NET MVC 5 / WCF 应用程序进行一些高密度托管,而空闲应用程序每个都使用 600~1000MB 的内存,这是相当多的,因为内存转储显示GC 堆只有大约 40MB 已满。 我怀疑这是由于服务器 GC 造成的,所以我尝试通过关注 https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/gcserver-element 来禁用它 并添加

<gcServer enabled="false" />

到我的 web.config,但这似乎没有任何效果

GCSettings.IsServerGC

仍然返回 true。我在这里错过了什么?

编辑:

使用普通 IIS 可以使用 https://weblogs.asp.net/owscott/setting-an-aspnet-config-file-per-application-pool 完成,但在 Azure 应用服务中,您没有执行此操作的权限。

【问题讨论】:

你认为你有什么问题?应用程序占用太多内存?在我看来,您认为自己有问题,但实际上没有。 @Neil 正如我所解释的,这些应用程序最多使用 1GB 的内存,什么也不做,正如我所分析的那样,GC 堆只有大约 40MB 的利用率。众所周知,服务器 GC 比工作站 GC 具有更高的内存占用,因此在这种情况下,对我来说,更有效的内存利用率比服务器 gc 的好处更重要。 如果他们没有真正使用它,那么当他们声称它时,它实际上并不存在。这意味着你猎杀鬼魂(预订而不是使用)。 @TomTom 我的意思是,它仍然占用我的应用服务计划中的物理资源,内存利用率约为 80%。它只是没有得到有效的使用。 这个设置似乎不再适用于 ASP.NET。我已经尝试过了,它甚至在我的本地环境中都不起作用。不过它适用于 ASP.NET Core。 【参考方案1】:

好的,首先,您可能必须使用 GC.Collect() 手动调试组件的内存使用情况: https://docs.microsoft.com/en-us/dotnet/api/system.gc.collect?view=netcore-3.1

通过这种方式,您可能能够查明代码中由于垃圾回收不当而导致内存泄漏的特定部分,或者是使用某些第三方库的部分。

一旦你完成了这个相当乏味的部分,那么根据你认为导致问题的原因,你应该考虑使用 (using var item = new NameOfClass()) 手动处理代码块,或者甚至尝试在导致它的类:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose。

【讨论】:

以上是关于如何在 Azure App Service 上运行的 ASP.NET Framework App 中禁用服务器 GC的主要内容,如果未能解决你的问题,请参考以下文章

Azure App Service for Linux是否支持http2?

Azure 应用服务App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?

Azure App Service 存在于子目录中时,如何设置其默认文档?

Azure App Service Application Insights 不显示依赖的 sql 命令文本

有啥方法可以为 Azure App Service 的磁盘空间不足设置警报

Azure App Service 共享托管中断容器启动