。NET Core 3.1上的Azure函数3抛出OutOfMemoryException

问题描述 投票:0回答:1

我最近将我的Azure Functions 2应用程序(针对.NET Core 2.2)更新为Azure Functions 3(针对.NET Core 3.1)。此升级不包括代码或逻辑更改,仅包括框架和程序包更新。

这是变更集的范围。

上一个项目文件:

<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>

更新的项目文件:

<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 Table Storage数据库读取数据。此功能已经在生产中工作了将近一年,没有任何问题。部署升级的(v3)Functions应用程序后,在调用从Azure Table Storage读取数据的HTTP触发函数期间,我观察到很多OutOfMemoryException出现。结果为500。该功能确实可以在不抛出OutOfMemoryException的情况下正常工作。我不知道成功与失败之间的区别。

这是发生异常的方法:

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;
}

Application Insights显示,此do/while循环在OutOfMemoryException发生之前成功执行了大约四到六次(不一致)的查询段。经过数小时的尝试,即使指向相同的Azure Table Storage实例,我也无法在本地复制此错误。

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

此应用程序中还有其他一些HTTP触发功能和计时器触发功能,它们可以从其他来源读取/写入数据,并且可以正常工作。甚至还有一个HTTP触发功能,可以将数据成功写入同一Azure表存储表,从而在读取期间导致问题。目前,我已经重新部署了针对v2的Azure Functions应用程序的构建(并且不再有OutOfMemoryException)。

有人对我可能错过的内容或解决此OutOfMemoryException问题有什么想法吗?

UPDATE

OutOfMemoryException问题仅在Azure Functions应用程序平台设置为64位时发生。当设置为32bit时,不再出现OutOfMemoryExceptions异常。

.net-core azure-functions azure-table-storage
1个回答
0
投票

似乎内存不足,根据此tutorial,我们可以知道消耗计划每个实例最大有1.5GB的内存。enter image description here

因此,如果您为功能选择消耗计划,则有时存储器可能会短缺((虽然它使我们可以将功能应用从32位更改为64位)。因此,我们需要为此制定一个应用服务计划。

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

顺便说一句,在这里我提供了tutorial作为应用服务计划的详细信息,供您参考。(根据本教程,我们可以知道64位需要的应用服务计划等级要高于“基本”)enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.