System.Web.HttpApplication.BeginRequest()中的间歇性延迟,与SessionState无关

Co7*_*o7e 7 asp.net servicestack newrelic

我们有两个Web应用程序(Azure Web角色),它们在System.Web.HttpApplication.BeginRequest期间偶尔会出现长时间延迟(40到60秒).我们知道这一点,因为我们正在使用NewRelic来监控我们的网络应用.通常的罪魁祸首是由于ASP.NET的会话状态锁定机制导致的线程敏捷性问题,但是我们不使用ASP.NET会话状态,并且在其中一个站点上我们根本不使用会话.

一个应用程序比另一个应用程序复杂得多,并且遭受更多延迟,但我会在这个问题中使用简单的应用程序来希望缩小根本原因.

简单的Web应用程序是一系列基于ServiceStack的Web服务.它不使用会话.它仅充当基于WCF的服务层的中介.它主要是将请求传递给WCF服务,然后将响应映射到视图以传输回代理.服务器甚至不会在它们运行的​​负载上出汗(最大2.5%的CPU).

那么,可能的原因是什么?

  1. 我最好的猜测是它是一个线程敏捷问题,因为它似乎在等待某些事情,这会暗示某个地方存在锁定.但是,如果不是会议状态,还等什么呢?NewRelic或ServiceStack导致锁定?
  2. NewRelic的报告是错误的,没有问题.好吧,NewRelic在我们以前使用ASP.NET会话状态时正确地报告了问题并且正在获得更多这些延迟.

小智 1

New Relic 没有特定于 ServiceStack 的工具,而 WCF 非常基础,没有自定义工具。如果没有更多信息,很难提供任何建议。线程敏捷性也是罪魁祸首,我建议首先调查该路线。

New Relic 可能将时间归因于一种不应该归因的方法。我可能会首先向 New Relic 支持开一张票,并包含您的所有信息(代理日志、IIS/ASP.NET 配置、自定义处理程序?以及 New Relic 图表的永久链接)。

  • 我们发现,除非您为受影响的页面添加 New Relic 自定义工具,否则 New Relic 往往会在 BeginRequest/BeginProcessRequest 下将内容混为一谈。这是因为这是 New Relic Agent 内置仪器的最后一个功能,因此就 New Relic 代理而言,此后的任何延迟都被视为该功能的一部分。引用 New Relic 的话:“对于代理而言,这可能就是它所知道的有关交易的全部信息。因此,我们将用该方法报告时间。” (2认同)