首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET内核3上的Azure函数3抛出OutOfMemoryException

.NET内核3上的Azure函数3抛出OutOfMemoryException
EN

Stack Overflow用户
提问于 2019-12-31 21:08:33
回答 1查看 1.3K关注 0票数 1

我最近更新了我的AzureFunctions2app(针对.NET Core2.2)到AzureFunctions3(针对.NET Core3.1)。此升级不包括代码或逻辑更改,只包括框架和包更新。

这就是变化的程度。

以前的项目文件:

代码语言:javascript
复制
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AzureFunctionsVersion>v2</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
    <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Http" Version="2.2.0" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.29" />
    <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
  </ItemGroup>
  ...
</Project>

更新的项目文件:

代码语言:javascript
复制
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AzureFunctionsVersion>v3</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
    <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.0" />
    <PackageReference Include="Microsoft.Extensions.Http" Version="3.1.0" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.2" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
  </ItemGroup>
  ...
</Project>

我有一个HTTP触发器函数,它从Azure表存储数据库读取数据。这一功能已经在生产中运行了将近一年,没有任何问题。在部署升级(v3)函数应用程序之后,我在调用从Azure存储读取数据的HTTP触发器函数时观察到许多OutOfMemoryException的出现。这导致了500个答复。这个函数可以正常工作,偶尔不会抛出一个OutOfMemoryException。我不知道成功和失败之间的区别。

这是发生异常的方法:

代码语言:javascript
复制
private async Task<IEnumerable<T>> ExecuteQuery<T>(CloudTable table, TableQuery<T> query) where T : ITableEntity, new()
{
    var results = new List<T>();
    TableContinuationToken token = null;

    do
    {
        // Read entities from each query segment.
        var segment = await table.ExecuteQuerySegmentedAsync(query, token);
        token = segment.ContinuationToken;

        results.AddRange(segment); // Build collection of records.
    }
    while (token != null);

    return results;
}

应用程序洞察显示,在发生do/while之前,这个OutOfMemoryException循环成功地执行了大约4到6次(不一致)查询段。经过数小时的尝试,我无法在本地复制此错误,甚至指向相同的Azure表存储实例。

我确实将函数应用程序的FUNCTIONS_EXTENSION_VERSION应用程序设置从~2更改为~3

在这个应用程序中还有其他几个HTTP触发器函数和计时器触发器函数,它们可以从其他来源读取/写入数据,并且可以正常工作。甚至还有一个HTTP触发器函数,它成功地将数据写入相同的Azure表存储表,从而在读取过程中引发问题。目前,我已经重新构建了以v2为目标的Azure函数应用程序(不再有OutOfMemoryException)。

有人知道我可能错过了什么,或者我可以做些什么来解决这个OutOfMemoryException问题吗?

更新

只有当Azure函数应用程序平台设置为64位时,才会出现此OutOfMemoryException问题。当设置为32位时,OutOfMemoryExceptions的狂暴停止。

对于其他在这里寻找解决方案的人,只需将您的功能应用程序平台切换到32位,直到微软解决了本期

更新:

对于任何阅读这篇文章的人来说,微软在2020年2月初发布了一个修复本期的版本。

EN

回答 1

Stack Overflow用户

发布于 2020-01-01 01:13:11

内存似乎是不够的,根据这个教程,我们可以知道消费计划每个实例只有1.5GB的最大内存。

因此,如果您为您的功能选择消费计划,内存有时可能是稀缺的(尽管它允许我们将功能应用程序从32位更改为64位)。因此,我们需要为它创建一个应用服务计划。

如果您已经创建了一个应用程序服务计划,我认为您可以尝试扩大您的应用程序服务计划,以获得更大的内存大小,并查看异常是否仍然显示。

顺便说一句,我在这里提供了一个应用程序服务计划细节的教程,供您参考。(根据本教程,我们可以知道64位需要的应用服务计划层高于“基本”)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59548452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档