2017-05-25 80 views
0

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

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

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

这两个函数在ASP.NET MVC Web应用程序(Web应用程序)中承载Azure应用程序服务并同时正确运行的webjobs之前实现。

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

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

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

编辑

从Matt Mason MSFT的建议之后的其他结果。

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

但是,在单独的应用程序中运行功能不是一个可接受的解决方案。从相同功能的应用程序同时运行的功能和 监控实况度量流

  • 结果:

    一个。每个函数都单独成功运行,并显示CPU总数为70%至97%,内存为400至700 MB。见第一张图片。

    b。两个功能在同一时间。我看到110%的CPU和800 MB的内存,然后指标流空白,我看到了。 “无在线服务器”。一段时间后,我再次看到一台服务器在线,但两种功能状态是“从未完成”。这是功能应用程序崩溃吗?请参阅下面的图像2,3和4。 one functiontwo functions at beginningtwo functions after some timeenter image description here

+0

您是否使用EF的共享(静态)Db连接实例?运行在同一个底层主机上的函数共享一个AppDomain,这可能会导致一些怪异。 –

+0

每个函数都将投射自己的EF的DbContext实例。作为额外的结果。我可以在单独的功能应用上同时运行这两个功能(请参阅上面的编辑)。 – donquijote

回答

1

尝试使用应用程式深入分析来分析你的函数:

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

你应该能够看到每个实例的性能计数器(使用多少内存有,等等) ,汇总的执行指标和执行日志。

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


更新: 这可能是该功能的应用程序崩溃。这也可能是因为CPU太高,它会影响App Insights数据上传 - 检查服务器ID是否已更改。

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

不幸的是缩放在这些情况下效果不好,我建议你在https://github.com/azure/azure-webjobs-sdk-script/issues上提出一个问题,要求跨实例更好地分配重量级定时器功能 - 但是,最好的办法是使用单独的应用程序或添加租赁管理/调度以确保您的功能不会同时运行。

+0

谢谢。请参阅上面的编辑以获得新的结果。 – donquijote

+0

更新了我的答案。 –

+0

再次感谢。我根据您的建议创建了该问题。你也知道在函数的设置中,我可以为这两个函数中的每一个定义它们应该总是被分派到一个新的实例吗? – donquijote