相关疑难解决方法(0)

NewRelic,异步http处理程序和AcquireRequestState

我在分布式ASP.NET Web应用程序中有一个异步处理程序的问题.首先让我解释一个用例:

  • 应用程序在使用.NET Framework 4.5.2的win 2012计算机上使用IIS 8
  • 应用程序通过web.config禁用了会话和身份验证模块

         <system.webServer>
           ....
           <modules>
                <remove name="WindowsAuthentication" />
                <remove name="Session" />
                <remove name="FormsAuthentication" />
            </modules>
         </system.webServer>
    
    Run Code Online (Sandbox Code Playgroud)
  • 应用程序使用自定义异步Web处理程序来提供特定请求

  • 应用程序的流量非常大(每台服务器每分钟大约有50k个请求,异步处理程序每​​个服务器每分钟有大约10k个请求,所有这些请求都来自NewRelic)
  • 应用程序通过多个w3wp进程(2个w3wp进程)和多个虚拟服务器(大约10个服务器)进行分发
  • 应用程序具有大量的连接

所有正常(同步请求)都正常工作,但执行更多工作的异步请求(这就是我们使用异步请求的原因)通常很慢,但NewRelic报告说它因"AcquireRequestState"而变慢.现在我看了谷歌和堆栈溢出,这个事件连接到创建一个会话,但我们在web.config中禁用了会话.有谁知道"AcquireRequestState"还能做什么?我们是否遗漏了删除会话状态的地方?从web.config添加到machine.config没有做任何事情......

以下是NewRelic中请求的片段:

   **Slowest components   Count Duration     %   **
     AcquireRequestState    1   12,600 ms   100%  --> WTF?
     ExecuteRequestHandler  1   5.01 ms     0%
     Integrated Pipeline    1   0.334 ms    0%
     UpdateRequestCache     1   0.3 ms      0%
     EndRequest             1   0.168 ms    0%
     AuthenticateRequest    1   0.161 ms    0%
     Total time                 12,600 ms   100%
Run Code Online (Sandbox Code Playgroud)

编辑:我<sessionState mode="Off" />在web.config(<system.web>部分),所以这不是它.

c# asp.net session asynchronous newrelic

22
推荐指数
1
解决办法
2142
查看次数

AcquireRequestState vs PreExecuteRequestHandler

我们在AcquireRequestState中花了相当多的时间来获取大量的ajax调用,在我们的旅行中我们偶然发现ASP.Net中的会话锁定gem,因此我们实现了一个自定义会话状态处理程序(基于下面的链接).

在进行更改并部署之后,我们看到AcquireRequestState急剧下降,但它已被PreExecuteRequestHandler取代.

今天早上我突然意识到我们已经包含了OWIN,这可能是PreExecuteRequestHandler占用这么多时间的原因.然后我继续删除它,当我部署代码时,PreExecuteRequestHandler从列表中消失.可悲的是,现在它已经以相同的成本再次被AcquireRequestState取代.

我们似乎在AJAX调用上非常努力地返回部分视图,AJAX调用返回原始类型或JSON对象似乎在很大程度上不受影响,尽管吞吐量更高.

所以这给我留下了3个问题,我绝对难以理解,我认为一个问题的答案会引导我们找到另外两个问题的答案.

1)为什么在安装OWIN时,成本从AcquireRequestState移动到PreExecuteEventHandler?OWIN上的东西标记为IRequireSessionState吗?(据我所知,AcquireRequestState应该在托管管道的早期发生)

2)我们如何获得有关AcquireRequestState内部实际内容的更多信息?或者我们花时间更好地返回JSON对象并使用它来呈现我们在UI上所需的内容?

3)我们确实看到一些请求(很少但是)在New Relic中映射到/ {controller}/{action}/{id},然后在上面提到的请求期间完全停留.尽管我们的路由设置限制只能路由到我们在项目中的控制器和操作.

PS:这看起来与以下内容非常相似,我们也在New Relic中看到了这一点:AcquireRequestState中的长时间延迟

自定义会话模块来自: 我刚刚发现为什么所有ASP.Net网站都很慢,我正在尝试解决该怎么做

c# request-pipeline newrelic

12
推荐指数
1
解决办法
2239
查看次数

标签 统计

c# ×2

newrelic ×2

asp.net ×1

asynchronous ×1

request-pipeline ×1

session ×1