问题 为什么Azure功能需要花费过多时间来“唤醒”?


我们有一个简单的Azure函数来进行DocumentDB查询。这似乎是我们第一次称之为漫长的等待,然后连续的呼叫非常快。

例如,我刚打开我们的应用程序,第一个函数调用需要10760毫秒,任何最终用户都明显可以注意到。在此之后,所有函数调用大约需要100毫秒进行处理,几乎察觉不到。

好像Azure函数中有一些“唤醒”循环。是否有某种方法可以最大限度地减少这种情况,或者更好的方法是将其记录在某处,以便我们能够理解这里到底发生了什么?


8814
2017-08-01 21:35


起源

你意思是 Cosmos DB....根据我的理解,在5分钟的空闲时间后,您的功能进入冷启动模式....防止更改为冷启动模式非常容易。只需在每5分钟执行的同一个功能应用程序中添加一个时间触发功能。但请注意,如果超出您的免费执行积分,这可能会导致额外费用。 - Hackerman
好吧,它仍然是CosmosDB DocumentDB(hehehe),但它可能是任何后端服务,我们仍然看到这个冷启动。这在任何地方记录? - Graham
我在这里找到了 blogs.msdn.microsoft.com/appserviceteam/2017/03/16/...  ...它说:冷启动发生在第一次请求函数应用程序空闲后,这发生在5分钟不活动后。当Function App启动时,它会为所有函数编制索引,并将C#和F#脚本编译为内存中的程序集。因此,编译时间将增加冷启动时间。由于功能执行尚未开始,客户不需要为冷启动付费,但它确实会导致事件处理延迟。 - Hackerman
你应该把这个答案:) - Graham
关于冷启动的原因和原因: blogs.msdn.microsoft.com/appserviceteam/2018/02/07/... - ElliotSchmelliot


答案:


在消费计划上运行的功能应用确实具有空闲时间,之后它们有效地进入休眠状态。下次调用需要像你观察到的那样“唤醒它们”,人们在评论中提到了这一点。

至于为什么会发生这种情况,微软可以在多租户环境中最优化地分配计算工作负载,同时确保在功能实际工作的时间内只向第二个计费。这是无服务器的美。

对于不可接受的行为的工作负载,您可以考虑从消费计划转移到实际的App Service计划。或者,您可以实现一个定时器触发的函数,例如每分钟关闭一次,并通过ping您不想进入睡眠状态的函数将其用作“保持活动”机制。


10
2017-08-02 12:45



我在同一个功能应用程序中添加了一个带有4分钟计时器的功能,但我们仍然偶尔会看到10到20秒的执行时间。这可能是其他什么在玩吗? - Graham
转到应用服务计划并利用永远在线功能: github.com/Azure/Azure-Functions/wiki/... - evilSnobu
在考虑了这个之后,如果我要转向应用服务计划,我只需编写本机node.js代码,而不会受到函数开销的困扰。 - Graham
它是....我们也使用Azure功能构建了我们认为简单干净的东西,然后遇到了这个问题,现在必须考虑为此付出更多代价的“成本”。回到服务器端,直到MSFT实现具有5秒以上冷启动的功能将导致用户放弃。如果在30天内没有访问过某个功能,我知道卸载...但是5分钟??? - Hell.Bent
有谁知道,这是一个编译的vs预编译问题吗?不知何故,我们有一个Azure函数在函数文件夹内部由HTML内部调用,它没有这个问题。 - Hell.Bent