Entity Framework 处理查询结果的性能不一致
Entity Framework and inconsistent performance with processing the results of a query
只需在我们的网站上设置 New Relic,我们就会注意到我们的一个网络 api 调用中出现了一些奇怪的峰值。
在这一点上,我将问题归结为单个 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 land,无论它在做什么,它都需要 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) 以查看尝试 return 到原始上下文是否有问题
- 我试过自己手动管理连接。所以在最开始打开然后在最后关闭
这不可能来自负载,因为现在确实有 2 个用户正在测试 Azure 站点...所以负载几乎不存在。
我已经尝试在本地重新创建它,但无法...而且我真的不确定从这里开始调试问题除了慢慢地破坏 EF 部分以获得像 Dapper 这样更简单的东西之外看看它的行为是否更一致。
技术栈:
- Sql蔚蓝
- Azure 网站扩展到两个实例
- EF 6 异步功能
- 网络api
您使用的 Sql Azure 是哪个版本?
我们在 Sql Azure Web(即将停用的那个)
中遇到了类似的问题
我们有一个查询使用 Entity Framework 6,agsint a table 大约有 700,000 行。在我的本地 sql 服务器上它花了一秒钟 - 在 Sql Azure 上它花了超过 1 分钟!,更糟糕的是有时它甚至超时
我的猜测是 Sql azure web 是一个共享 sql 服务器并且资源有限。
只需在我们的网站上设置 New Relic,我们就会注意到我们的一个网络 api 调用中出现了一些奇怪的峰值。
在这一点上,我将问题归结为单个 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 land,无论它在做什么,它都需要 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) 以查看尝试 return 到原始上下文是否有问题
- 我试过自己手动管理连接。所以在最开始打开然后在最后关闭
这不可能来自负载,因为现在确实有 2 个用户正在测试 Azure 站点...所以负载几乎不存在。
我已经尝试在本地重新创建它,但无法...而且我真的不确定从这里开始调试问题除了慢慢地破坏 EF 部分以获得像 Dapper 这样更简单的东西之外看看它的行为是否更一致。
技术栈:
- Sql蔚蓝
- Azure 网站扩展到两个实例
- EF 6 异步功能
- 网络api
您使用的 Sql Azure 是哪个版本?
我们在 Sql Azure Web(即将停用的那个)
中遇到了类似的问题我们有一个查询使用 Entity Framework 6,agsint a table 大约有 700,000 行。在我的本地 sql 服务器上它花了一秒钟 - 在 Sql Azure 上它花了超过 1 分钟!,更糟糕的是有时它甚至超时
我的猜测是 Sql azure web 是一个共享 sql 服务器并且资源有限。