在过去的几天里,我们已经开始获得Entity Framework与Azure SQL数据库通信所引发的间歇性异常。它抛出的异常特别与我们的代码有关,但消息是:
执行命令定义时发生错误。见 内部异常细节。执行超时已过期。超时 在完成操作或服务器之前经过的时间段 没有回应。等待操作超时
显然,对数据库的请求已经超时,但它开始突然发生并且之前没有发生过。在最近几天,我们看到平均响应时间也增加了: 最佳响应时间并不是那么快,因为它们需要进行一些改进和优化,但您可以看到明显的增加。
我们的移动应用程序在启动时会从我们的API请求大量信息并提出一些似乎一起失败的请求,几分钟后这些请求单独运行就可以了。
关于这里可能发生什么的任何想法? Azure门户中没有任何错误,除了通知我们的API响应速度比通常慢(我们知道!)
答案 0 :(得分:3)
令人恼火的是,这是我第二次被这个问题所困扰,所以值得发帖。
这是您的数据库层和Azure为您提供的DTU限制的结果。
DTU是服务层性能的度量单位,是几种数据库特征的摘要。每个服务层都分配了一定数量的DTU,作为比较一个层与另一个层的性能水平的简便方法。 来自:Azure SQL Database "DTU percentage" metric
可以找到关于发生了什么的线索here:
当您的工作负载超过任何这些资源的数量时,您的吞吐量会受到限制 - 导致性能降低和超时。
我们使用的是基本层数据库,所以我们的限制是5 DTU,当应用程序启动并达到此上限时,我们一次请求大量数据(当然是太多了)。 Azure SQl限制了我们的查询,减慢了一些并拒绝其他人。之前记得这样的事情,我已经检查了Azure门户网站中的DTU图,但我一直在寻找更长的时间尺度,因此对我来说隐藏着大量的使用高峰。
我们现在解决了这个问题,方法是将Azure数据库层和DTU限制从5增加到20(4倍性能),从而停止所有异常和失败的请求。
由于EntityFramework提供的模糊异常和缓慢的请求,这是一个特别恼人的问题。 Azure SQL将来可以包含有关DTU上限的一些信息。
我们为防止这种情况而添加的另一件事是,如果我们的DTU使用量再次超过80%,将会通知我们。请参阅Azure门户> AzureSQL数据库>监控>警报规则。
在我看来,Azure应该自动创建这个警报,我确定它不仅仅是因为我被烧毁了!