我有一个处理大量 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()
or结尾ReuseBuffer()
。
两者都GetBuffer()
以ReuseBuffer()
a 开头lock()
,所以我认为 CPU 在自旋锁中花费了很多时间(我的理解是lock
在让线程进入睡眠状态之前会旋转一段时间)。
我的问题 - 这是 CPU 花费时间的常见地方吗?这完全是在 IIS 代码中,那么我能做些什么来减少 CPU 负载呢?这是配置问题,还是我们的应用程序之前执行的操作的结果?
这些机器非常强大,它们有 4 个四核。我没有当前可用的正在运行的线程数。