System.OutOfMemoryException 在 Azure 中但不在本地

System.OutOfMemoryException in Azure but not locally

我有以下代码,它使用名为 Aspose.Words 的第三方库:

SaveOptions saveOptions = SaveOptions.CreateSaveOptions(SaveFormat.Docx);
saveOptions.MemoryOptimization = true;
saveOptions.TempFolder = Path.GetTempPath();
var mm = new RecyclableMemoryStreamManager();
using (RecyclableMemoryStream ms = new RecyclableMemoryStream(mm))
{
    doc.Save(ms, saveOptions);
    return ms.ToArray();
}

我在 using 语句中遇到了以下错误。

Mvc.ExceptionHandling.AbpExceptionFilter - Exception of type 'System.OutOfMemoryException' was thrown.

我无法在本地重现它(我的内存使用量在处理过程中增加了大约 200mb,所以它并没有真正使用太多内存)。该文件本身只有 56MB 大小。 Aspose 告诉我,它最多可以使用 10 倍的量……即使这样也应该没问题。我已更改服务计划以扩展至 14GB 内存。

我正在使用 RecyclableMemoryStreamManager,因为我已经用 MemoryStream 尝试过它,但无济于事。

我还能做些什么来解决这个我只在 Azure(开发和生产)中遇到的问题? Azure API 是 .net 核心堆栈并具有 64 位平台。

提前致谢。

扩展您的 Azure 服务的应用服务计划。应用服务计划中的内存可能非常少。还要检查您在 App Service Plan 中是否有多个服务 运行 然后横向扩展。

做纵向扩展或横向扩展。

您使用的是什么 Azure 服务产品?

大多数基于应用服务的产品,包括消费计划中的 Azure Functions,每个 process/app 最大内存为 1.5GB,无论您选择何种应用服务定价计划。 Azure消耗计划中的函数有一个 max memory limit of 1.5GB per function app instance (scaling can allow multiple instances) and other offerings also have limits 来防止你吞噬底层机器的所有内存。 (您的本地环境没有这些限制)

没有实际指标很难解决。 运行 你的代码,然后在崩溃后几分钟查看应用程序的指标,尤其是在工作内存和专用字节下。 这些可以在应用服务的指标部分找到。

如果这些在您崩溃之前达到了极限,这可能就是原因。如果是这种情况,您在 Azure 中的选择是

  • 减少内存占用
    • 优化当前工作,使其使用更少的内存
    • 或者将工作分成多个作业,每个作业使用较少的内存并使用 Azure Functions 或类似的
  • 使用应用服务环境(大量内存、独立网络,但不便宜)
  • 使用虚拟机(Azure 获得了几乎任何大小的 memory optimized VMs

我只是重新启动了我的应用程序服务,然后它就开始正常工作了。