Azure:.NET Framework(首先使用EF代码)和Microsoft SQL Server对某些查询的CPU



我有一个在Azure中运行的应用程序。它有一个.NET框架API部署为应用程序服务,连接到Microsoft Sql Server。.NET框架应用程序使用实体框架代码优先访问数据库。

通常,应用程序运行平稳。但是,一个端点有时会变得没有响应(即需要几分钟才能返回答案(。该端点通过EntityFramework进行查询,并仅从数据库中检索几个数据点。这是针对2到8个传感器执行的代码(没有任何区别(:

List<Measurement> result = CreateContext().Measurements
.Where(m => m.MeasurementSeries.SensorInfoID == sensorId)
.Where(m => m.MeasurementSeries.StartTime <= toTime && m.MeasurementSeries.EndTime >= fromTime)
.Where(m => m.Time > fromTime && m.Time <= toTime)
.OrderByDescending(m => m.Time)
.ToList();

通过查看指标(也来自ApplicationInsight(,我没有看到任何奇怪的查询被执行。我看到了预期的查询,数据库计算利用率跳到了100%。

从同一代码执行的同一查询连接到同一远程数据库,但.NET Framework应用程序在本地运行,从数据库计算所需时间不到1秒,不到1%。当查询(最终(完成时,数据库计算利用率将回到零。API计算利用率一直很低。直接对数据库执行相同的SQL查询不到一秒钟。

所有其他端点都可以正常工作,其中一些端点会对数据库进行更重的查询。

我多次尝试从多个源重新运行同一查询,重新启动、停止和启动,重新部署应用程序。什么也没发生。上次,过了半天,它又开始工作了。这一次已经过去一天了,什么都没有。

你有指向哪里查找问题的指针吗?如果我能提供更多信息,请告诉我,因为我可能没有想过,这也可以帮助我解决问题。

感谢@PrebenHuybrechts在问题评论中提供了解决问题的工具。正如建议的那样,对于像这样的问题,最好检查锁、等待统计数据和执行计划。

TL;DR

最大DOP设置为无限,考虑到我正在以无服务器的方式运行Sql Server,可从2扩展到16 vCores,它有时会对一个非常小的查询进行过度并行化。

以下工具对调试很有用:sp_whoisative、sp_BlitzWho。

长(er(版本

首先,我使用sp_whoisactive来查看在等待API的答复时发生了什么。我打电话给端点,运行

EXEC sp_WhoIsActive
@get_task_info = 2

在结果中,我发现入罪查询,挂起,wait_info状态为CXPACKET。从这篇文章中,我发现CXPACKET意味着主进程正在等待从进程完成处理,Microsoft建议将最大DOP(最大并行度(设置为8。我用微软SSMS做到了这一点,它就像一个魅力。

猜测,考虑到在其他地方使用了相同的查询来检索更多的数据,它正在针对该场景进行优化,这使得查询只检索很少的数据点时速度非常慢。

相关内容

最新更新