NewRelic,异步http处理程序和AcquireRequestState

时间:2016-02-01 14:34:41

标签: c# asp.net session asynchronous newrelic

我在分布式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>
    
  • 应用程序使用自定义异步Web处理程序来提供特定请求

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

所有正常(同步请求)都正常工作,但执行更多工作的异步请求(这就是我们使用异步请求的原因)通常很慢,但NewRelic报告说它很慢,因为&#34; AcquireRequestState& #34 ;.现在,我已经查看了google和堆栈溢出,此事件与创建会话相关,但我们在web.config中禁用了会话。有谁知道还有什么可以&#34; AcquireRequestState&#34;可能会这样做?我们是否遗漏了删除会话状态的地方?将它从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%

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

3 个答案:

答案 0 :(得分:1)

我已经调查了这个,因为我们有类似的问题,我发现这个forum post,有趣的答案是:

  

不幸的是,问题并不像关闭sessionState那么简单。实际上,在使用AcquireRequestState描述挑战时,其中一个关键短语是短语,例如,当提到此事件时会话状态。在深入研究这个(实际上看.NET源代码)时,我们可以看到在执行EventHandler或创建RequestNotification对象时调用它。我敢说有其他方法和/或事件,当被调用时,将引发AcquireRequestState事件。追踪所有这些代表着一种挣扎。在更规范化的会话状态讨论之外,这似乎没有被谈论过很多东西。   我们看到这个事件最常见的地方肯定与会话状态管理有关。但是有很明显的异常值,这些事件仍然可以提出。它甚至可以直接从应用程序代码调用。代理人所要解决的问题是它可以识别事件,但很少能识别事件。当它作为ASP管道的一部分被引发时,代理获得的唯一通知是这是事务的一个部分。事件中执行的源或方法是代理在默认情况下很少使用的东西。   我希望我们能为您提供更多见解。 .NET应用程序中有许多移动部件,其中一些涉及操作系统本身,IIS,.NET版本,方法是否异步,应用程序池设置,执行模式,权限等。   虽然我不想在这里打开第二个蠕虫病毒,但是由于缺少500个错误的堆栈跟踪问题。代理在提供和/或可用时提供堆栈跟踪。在ASP管道中发生堆栈跟踪(如果存在的话)非常重要。有时它会在执行任何实际应用程序代码之前发生。在这种情况下,会向应用程序报告错误,从而让.NET代理查看并报告发生了错误,但未提供其他详细信息。代理只是看到它发生并报告尽可能多的信息。除此之外,代理商根本没有提供进一步的细节。

我们放弃了,所以我有兴趣知道你是否弄清楚了!

答案 1 :(得分:0)

Profile Module也使用了AcquireRequestState。你试过禁用吗?

<modules>
   <remove others unwanted modules... />
   <remove name="Profile" />
</modules>

答案 2 :(得分:0)

所以我有同样的问题。我有很多并发的ajax请求,所有使用的变量都存储在ASP.NET ClaimsIdentity中,使用SessionState可以有效地进行此操作。这意味着,很多服务器响应时间只是在等待SessionState解锁。

我通过减小锁定轮询间隔来解决它:

var months=new[]{ "2020M01" ,"2019M12","2020M03"};
var latestMonth=months.Max();
var earliestMonth=months.Min();

以上解决方案已在this blog article

中披露
相关问题