Azure 中的 System.OutOfMemoryException 但不是本地

Posted

技术标签:

【中文标题】Azure 中的 System.OutOfMemoryException 但不是本地【英文标题】:System.OutOfMemoryException in Azure but not locally 【发布时间】:2020-04-07 02:47:56 【问题描述】:

我有以下代码,它使用名为 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 - 引发了“System.OutOfMemoryException”类型的异常。

我无法在本地复制它(我的内存使用量在处理过程中可能增加了 200mb,因此它并没有真正使用太多内存)。文件本身只有 56MB 大小。 Aspose 告诉我,它最多可以使用该数量的 10 倍……即使它仍然应该没问题。我已将服务计划更改为扩展到 14GB 内存。

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

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

提前致谢。

【问题讨论】:

【参考方案1】:

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

大多数基于应用服务的产品,包括消费计划中的 Azure Functions,每个进程/应用程序的最大内存为 1.5GB,无论您选择的应用服务定价计划如何。消费计划中的 Azure Functions 都有一个 @每个函数应用实例 987654321@(扩展可以允许多个实例)和其他产品也有limits,以防止您吞噬底层机器的所有内存。 (您的本地环境没有这些限制)

没有实际指标很难解决。运行您的代码,然后在崩溃后等待几分钟,然后查看应用的指标,尤其是在工作内存和私有字节下。这些位于应用服务的指标部分。

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

减少内存占用 优化当前工作以减少内存占用 或将工作拆分为多个作业,每个作业使用较少的内存并使用 Azure Functions 或类似功能 使用应用服务环境(大量内存、隔离网络,但不便宜) 使用虚拟机(Azure 得到memory optimized VMs 几乎适用于任何大小)

【讨论】:

感谢您的反馈 - 我将解耦到应用程序并使用 Azure Functions。我希望有一种方法来安排删除,例如 Remove-AzureStorageFile (docs.microsoft.com/en-us/powershell/module/azure.storage/…) 顺便说一句,我已经用限制更新了答案。 1.5GB 显然仅用于消费计划中的 azure 功能。但其他点是有效的。【参考方案2】:

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

进行纵向扩展或横向扩展。

【讨论】:

我已尝试扩大规模 - 我现在将尝试扩大规模。谢谢 如果只有一个实例在运行(用于我的测试),我是否需要扩展? 如果多个服务正在运行,那么您需要横向扩展。检查您的应用服务计划的指标“CPU百分比”和“内存百分比”并决定 还要检查您是部署 32 位可执行文件还是 64 位可执行文件。如果它是 32 位的,即使你有更多的 RAM,它也不能使用超过 2 GB 的内存 ***.com/questions/1153702/…【参考方案3】:

我只是重新启动了我的应用服务,然后它就可以正常工作了。

【讨论】:

以上是关于Azure 中的 System.OutOfMemoryException 但不是本地的主要内容,如果未能解决你的问题,请参考以下文章

Azure 中的 ConnectionString 没有覆盖 Azure 函数的 LocalSqlServer

是否可以将 Azure 文件共享中的单个文件/文件夹挂载到 Azure 容器实例

仅从 Azure 存储 [Azure-Blob][REST] 中的 Blob 列表获取特定元数据

使用 python 将 azure Runbook 与 azure 中的文件共享连接起来

如何使用带有 Azure 存储帐户的 Azure 文件中的 PHP 显示文本内容本身?

在 azure 中的发布管道之间传递变量(触发 azure 管道扩展)