【问题标题】:CPU on IIS server pegged at 100% in BufferAllocator.GetBuffer()IIS 服务器上的 CPU 在 BufferAllocator.GetBuffer() 中固定为 100%
【发布时间】:2013-10-03 16:53:02
【问题描述】:

我有一个处理大量 RESTful 请求的 IIS7 应用程序池。当事情变热时,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 个四核。我没有当前可用的正在运行的线程数。

【问题讨论】:

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


    【解决方案1】:

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

    解决方法是用更少的线程拥有更多的进程 - 现在 CPU 使用率是合理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多