Azure Functions 并发超时

Posted

技术标签:

【中文标题】Azure Functions 并发超时【英文标题】:Azure Functions Concurrency Timeout 【发布时间】:2017-10-26 01:58:47 【问题描述】:

使用消费计划中的 Azure Functions 应用程序,我有两个计时器触发的 C# 函数,大约需要 1 分钟才能运行。

如果他们在不同的时间运行,他们每个人都会成功运行。但是,如果我在时间上重叠运行它们,那么函数永远不会完成并且它们会超时。

我看不出并发问题可能来自哪里。这些函数通过 EF 从 Azure SQL 读取数据,并将结果写入 Azure 存储上的不同 blob。

这两个功能之前在 Azure 应用服务中托管的 ASP.NET MVC Web 应用(Web 应用)中作为 Web 作业实现,并同时正常运行。

当我将这两个 webjobs 移动到 Azure Functions 应用程序时,我实际上将 Web App bin 文件夹的内容复制到了 Function App bin 文件夹中,然后在每个函数中引用了必要的 dll。

我认为这个并发问题的一个原因是复制 Web App bin 文件夹的内容。

我能想到的另一个原因是,如果消耗计划没有对每个新功能的内存进行预算,因此无法正确扩展。例如,如果触发的新函数本身需要大量内存,则可能应该将其分配给新的计算实例,而不是共享以前的计算实例。因为我的函数占用大量内存,所以如果第一个函数分配给一个小型计算实例,而第二个函数分配给同一个小型计算实例,则两者可能一起超过导致超时的限制。

编辑

根据 Matt Mason MSFT 的建议获得更多结果。

使用第二个函数应用程序。同样处于消费模式并具有相同的 bin 文件夹中的文件。我能够同时运行这两个功能 时间在不同的功能应用程序上,他们成功完成。这 让我相信问题应该来自功能应用程序和 不在 Azure SQL 或 Blob 存储依赖项上。

但是,在单独的应用程序中运行函数不是可接受的解决方案。

在同一个函数应用上运行这两个函数的结果 监控实时指标流:

一个。每个函数单独成功运行,并显示 CPU Total 大约为 70% 到 97%,内存大约为 400 到 700 MB。查看第一张图片。

b.两者同时发挥作用。我看到 CPU 为 110%,内存为 800 MB,然后指标流变为空白,我看到了。 “没有服务器在线”。过了一会儿,我再次看到一台服务器在线,但两个功能状态为“从未完成”。这是函数应用程序中的崩溃吗?请参见下面的图像 2、3 和 4。

【问题讨论】:

您是否正在为 EF 使用 Db 连接的共享(静态)实例?在同一底层主机上运行的函数共享一个 AppDomain,这可能会导致一些奇怪。 每个函数都在转换自己的 EF DbContext 实例。作为附加结果。我可以在不同的函数应用程序上同时运行这两个函数(参见上面的编辑)。 【参考方案1】:

尝试使用 App Insights 来分析您的函数:

https://github.com/Azure/Azure-Functions/wiki/App-Insights-(Preview)

您应该能够查看每个实例的性能计数器(内存使用量等)、汇总的执行指标和执行日志。

如果函数绝对不能一起运行,请尝试将它们放在单独的函数应用中,这样它们就不会在同一个实例上运行。


更新: 这可能是函数应用程序的崩溃。也可能是 CPU 太高以至于影响 App Insights 数据上传 - 检查服务器 ID 是否已更改。

您可以在函数中使用ILogger 参数绑定并记录进度更新,以在应用洞察分析中查看一些执行跟踪。

不幸的是,扩展在这些情况下效果不佳,我建议您在https://github.com/azure/azure-webjobs-sdk-script/issues 提出问题,要求在实例之间更好地分配重量级计时器功能 - 但是,最好的选择是使用单独的应用程序或添加租约管理/调度以确保您的功能不会同时运行。

【讨论】:

谢谢。请参阅上面的编辑以获取新结果。 更新了我的答案。 再次感谢。我根据您的建议创建了这个问题。另外你知道我是否可以在函数的设置中为这两个函数中的每一个定义它们应该始终被分派到一个新实例吗? 目前还没有这样的设置,但这是一个很好的建议。

以上是关于Azure Functions 并发超时的主要内容,如果未能解决你的问题,请参考以下文章

应用服务计划的 Azure 函数应用超时

Azure Functions 的 Azure 队列触发器:配置最小轮询间隔

限制服务总线消息接收的 Azure Functions 速率

Azure Functions:我可以对 BlobTriggered 函数进行不同的配置吗?

如何使用 Python Azure Functions QueueTrigger 手动使消息出队?

Azure Functions - 使用 Azure Functions 的表存储触发器