使用两个应用程序的 Azure App Service Plan 内存使用率 100% - 使用的工作集超过 10gb

100% Memory usage on Azure App Service Plan with two Apps - working set used 10gb+

我有一个 14GB 内存的应用程序服务计划 - 它应该足以满足我的应用程序的需要。它上面有两个应用程序服务 运行,每个都相同 - 这些应用程序的私有内存消耗徘徊在 1gb 左右,但在高使用率期间可能会飙升至 4gb。一个应用的使用模式比另一个更频繁。

最近,在高使用率期间,我注意到频繁使用的服务可能会变得无响应,并且应用服务计划中的内存使用率保持在 100%。

高流量服务正在使用 4gb 的专用内存并开始大幅减速。当我转到 /scm.../ProcessExplorer/ 页面时,我可以看到低流量服务使用了 1gb 私有内存和 10gb 'Working Set'.

据我了解,至少在一台机器上,当另一个进程需要该内存时,应该释放工作集。当两个应用程序服务共享一个计划时,这会自然发生吗?

在我看来看起来低流量实例上的工作集没有被释放来满足高流量应用服务的需求。

如果确实如此,简单的解决方法是将它们移动到单独的应用程序服务计划中,每个计划有 7GB 的内存。然而,这似乎可能只是在转移问题——有没有其他人注意到单个应用程序服务计划中多个应用程序的类似问题?据我了解,这些不应该相互干扰到需要分开的程度。还是我误诊了?

在一些高内存消耗的场景中,您的应用程序可能确实需要更多的计算资源。在这种情况下,请考虑扩展到更高的服务层,以便应用程序获得所需的所有资源。其他时候,代码中的错误可能会导致内存泄漏。编码实践也可能会增加内存消耗。深入了解是什么触发了高内存消耗是一个分为两部分的过程。首先,创建进程转储,然后分析进程转储。 Azure 站点扩展库中的崩溃诊断程序可以高效地执行这两个步骤。欲了解更多信息。

参考 Capture and analyze a dump file for intermittent high memory for Web Apps.

最后我们通过缓解措施解决了这个问题,而不是找到根本原因。

几个月前,我们找到了解决之前内存问题的缓解策略,即每晚使用 powershell 脚本重新启动服务器。这似乎可以防止内存随着时间的推移而增加,并且只会花费我们几秒钟的停机时间。我们的系统没有太多夜间流量,因为我们的用户都位于同一地理位置。

然而,我们最近发现夜间重启报告 'success' 但实际上每晚都因凭据过期而失败。这意味着我们在我发布的问题中遇到的内存问题实际上因服务器正常运行数周而加剧。恢复隔夜重启解决了我们看到的内存问题,我们当然不会再看到我们的系统再次使用 10gb+。

如果他们再次抬头,我们将调查内存问题。 KetanChawda-MSFT 关于使用内存转储来分析内存使用情况的建议将在需要时用于此调查。