IIS服务器上的CPU在BufferAllocator.GetBuffer()中挂起100%

时间:2013-10-03 16:53:02

标签: c# iis iis-7 cpu-usage

我有一个IIS7应用程序池,可以处理大量RESTful请求。当事情变得激烈时,CPU使用率达到100%并且请求需要花费很多秒才能处理。

使用ANTS进行分析时,我们发现大多数CPU时间经常出现在这里:

System.Web.Hosting.PipelineRuntime.ProcessRequestNotification
 System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper
  (Unmanaged code)
   System.Web.Hosting.PipelineRuntime.ProcessRequestNotification
    System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper
     System.Web.HttpRuntime.ProcessRequestNotificationPrivate
      System.Web.HttpApplication.BeginProcessRequestNotification
       System.Web.HttpApplication+PipelineStepManager.ResumeSteps
        System.Web.HttpApplication.ExecuteStep
         System.Web.HttpApplication+CallFilterExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute
          System.Web.HttpResponse.FilterOutput
           System.Web.HttpWriter.FilterIntegrated
            System.Web.Hosting.IIS7WorkerRequest.GetBufferedResponseChunks
             System.Web.Hosting.RecyclableArrayHelper.GetIntegerArray
              >> System.Web.BufferAllocator.GetBuffer
               (Thread blocked)
              >> System.Web.BufferAllocator.ReuseBuffer
               (Thread blocked)

实际上有几种不同的堆栈跟踪,但它们总是以GetBuffer()ReuseBuffer()结束。

GetBuffer()ReuseBuffer()都以lock()开头,所以我认为CPU在自旋锁中花了很多时间(我的理解是lock旋转了在让线程进入睡眠状态之前的位。)

我的问题 - 这是CPU花费时间的常见地方吗?这完全是在IIS代码中,所以我该怎么做才能减少CPU负载?这是一个配置问题,还是我们的应用程序之前做过的操作的结果?

机器非常强劲,它们有4个四核。我没有当前可用的线程数。

1 个答案:

答案 0 :(得分:3)

这几乎是我们所怀疑的 - 线程都在螺旋锁中花费了大量的时间,因为它们都在竞争相同的锁。我们有数百个线程。

修复是让更多进程拥有更少的线程 - 现在CPU使用率是合理的。