Web Api 2 Controller 和 Handler 之间有 5 秒的延迟

Posted

技术标签:

【中文标题】Web Api 2 Controller 和 Handler 之间有 5 秒的延迟【英文标题】:Web Api 2 Controller and Handler have five second delay between them 【发布时间】: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 更新? 【参考方案1】:

感谢您的帮助,我最终找到了答案。

我们有服务被注入到控制器中,它们的构造函数使用了潜在的异步调用来预加载一些东西。将其更改为使用 AsyncLazy 是解决方案。

对处于类似情况的人可能有用的步骤,现在列举。

玩过棋盘游戏猜猜谁?这与调试非常相似。你想问那一半的潜在问题。不要以“是我觉得脏的这种特定方法”开头,而是以:

哪些有效,哪些无效?找出不同之处。这就是你的问题集。 使用通用问题缩小问题集。找到共同的相似之处并摆脱它们。是异步调用吗? (感谢评论者)它是像死锁一样的东西吗? (再次感谢)。是首次点击还是初始加载? 一旦删除了共享的相似性,就可以开始注释代码了。我把它缩小到一个构造函数,它被注入了三个对象并且没有做任何它自己的工作。如果不是前两个对象,我就知道问题出在哪里!

【讨论】:

以上是关于Web Api 2 Controller 和 Handler 之间有 5 秒的延迟的主要内容,如果未能解决你的问题,请参考以下文章

指定调用Web Api 2 Controller方法的正确路由

OpenStack Mitaka HA高可用搭建

openstack controller ha测试环境搭建记录(十四)——配置cinder(存储节点)

openstack controller HA

《ASP.NET5》无法路由到Web API Controller控制器

《ASP.NET5》Web API Controller Class学习