【发布时间】:2014-10-25 01:20:53
【问题描述】:
最近,我的 Web Api 2 w/Entity Framework 6.1 服务器上的 Web 请求的速度急剧下降。向查询数据库的所有请求添加 ~5000 毫秒。在过去的三天里,我一直在扯头发,试图弄清楚。
设置:
- Web API 2.2
- 实体框架 6.1.1
- 用于 IoC 的 Autofac,DbContext 是 InstancePerLifetimeScope() 以及其他所有内容。
- 一个自定义 HttpParameterBinding 用于从访问令牌中获取实体 ID。这确实会查询数据库。
- 只有一个 DelegatingHandler,用于记录请求
我做了什么:
- 预生成的视图,略有改进
- 我们查询的实体中的属性减少,没有改进
- 关闭 AutoTrackChanges,没有改善
- 在多个请求上尝试了 AsNoTracking(),没有任何改进
- 使用 Ant Performance Profiler 进行分析,没什么用处
- 使用 SQL Management Studio 分析数据库,查询速度很快
为什么我说处理程序和控制器之间存在延迟?我在控制器操作的开始和结束时使用 DateTime.Now 对其进行计时,1745ms 日志记录处理程序在等待 base.SendAsync(request,cancellationToken) 之前和之后执行时间,6234ms 。我也对绑定进行了计时,只有 2 毫秒。
那是 4489 毫秒 的时间是下落不明的。其他请求有类似的时间。它发生在日志处理程序获取请求并报告它之后但在绑定开始之前。里面会发生什么?它来自哪里?我们没有任何衍生的异步 void 方法,我们没有任何需要花费这么长时间的每个请求操作。完全被难住了。
编辑:重复相同的请求不会提高性能。我不认为单次命中是问题所在,它一直很差。
【问题讨论】:
-
如果您以完全相同的方式进行第二次请求,会更快吗?需要牢记许多首次命中惩罚,启动应用程序池并为任何 .net 应用程序加载程序集,例如在第一次调用时从数据库中加载元数据。
-
我会寻找与异步调用相关的东西。线程池的大小、任何类似死锁的行为(例如等待任务)等。
-
您是否知道在降速之前对应用程序池进行的任何更改或任何 Windows 更新?
标签: c# entity-framework async-await asp.net-web-api2 dotnet-httpclient