【发布时间】:2015-02-25 16:28:29
【问题描述】:
刚刚在我们的网站上设置了 New Relic,我们注意到我们的一个 webapi 调用中出现了一些奇怪的峰值。
此时,我将问题归结为单个 EF 查询,我将其移至其自己的方法,因此我可以使用 New Relic 对其进行检测..
该方法唯一要做的就是
//I changed this from ToListAsync to ToList to see if it would help
var result = Context.Data.Where(x=> x.id = id).ToList();
return result;
就是这样。。
使用 New Relic 并注销所有 SQL 查询我相当肯定问题不在于查询速度慢。 New Relic 表示,该方法平均只花费 339 毫秒对数据库运行,我从来自 EF 的跟踪数据中看到了类似的数字。但是这些方法的平均执行时间是 16 秒。
通常此方法在 2 秒内执行,但有时 EF 似乎只是进入 lala 领域,完成它正在做的任何事情都需要 60 或 70 秒。但我从未见过数据库查询本身花费的时间超过 500 毫秒。并且查询每次运行时都会检索几乎完全相同的数据集..
我在日志中注意到,在执行查询和关闭连接之间总是有很长的等待时间。这是日志的示例输出
- 应用程序:2015-02-17T10:04:11 PID[3556] 信息 -- 在 6 毫秒内完成,结果:SqlDataReader 应用程序:应用程序:
- 2015-02-17T10:04:11 PID[3556] 信息应用:应用:
- 2015-02-17T10:04:22 PID[3556] 信息于 2/17/2015 10:04:22 AM +00:00 关闭连接
注意完成时间是 6 毫秒,但在关闭连接之前会有 11 秒的延迟
- 我已尝试删除此调用的异步,但没有帮助
- 我尝试在所有内容上使用 ConfigureAwait(false) 以查看尝试返回原始上下文是否存在问题
- 我已经尝试自己手动管理连接。所以一开始就打开,最后关闭
这不可能来自负载,因为现在确实有 2 个用户对 Azure 站点进行 beta 测试...所以负载几乎不存在。
我尝试在本地重新创建它,但无法...而且我真的不确定从这里调试问题除了慢慢地去除 EF 部件以获得更简单的东西(如 Dapper)以查看是否行为更一致。
技术栈:
- Sql Azure
- Azure 网站扩展到两个实例
- EF 6 异步功能
- 网页接口
【问题讨论】:
标签: entity-framework-6 azure-sql-database azure-web-app-service newrelic