Asp.net应用程序运行缓慢但CPU最高为40%

was*_*igh 10 asp.net performance crash-dumps

我在生产服务器上有一个奇怪的情况.asp.net的连接排队,但CPU只有40%.此外,数据库在30%CPU下运行良好.

评论中要求的更多历史记录:

  • 在高峰时段,这些网站每小时可以获得大约20,000名访客.
  • 该站点是一个带有大量AJAX/POST的asp.net webforms应用程序
  • 该网站使用了大量用户生成的内容
  • 我们使用测试页来衡量站点的性能,该测试页确实击中了数据库和站点使用的Web服务.此页面在正常负载下一秒钟内即可获得服务.当请求超过4秒时,将应用程序定义为慢速.
  • 从测量结果我们可以看出连接时间很快,但处理时间很长.
  • 我们无法确定单个请求的响应速度慢,网站在正常时间运行正常但在高峰时段运行缓慢
  • 我们遇到了一个问题,即网站受CPU限制(也就是100%运行),我们修复了这个问题
  • 我们也遇到了appdomain重启的例外问题,我们修复了这个问题
  • 在高峰时段,我看看asp.net性能计数器.我们可以看到我们有600个当前连接和500个排队连接的行为.
  • 在高峰时段,CPU约为40%(这让我认为它不受CPU限制)
  • 物理内存约占60%
  • 在高峰时间,DatabaseServer CPU大约是30%(这让我认为它不是数据库绑定的)

我的结论是,其他东西阻止服务器更快地处理请求.可能的嫌疑人

  • 死锁(!syncblk只提供一个锁)
  • 磁盘I/O(通过sysinternals procesexplorer检查:3.5 mB/s)
  • 垃圾收集(峰值期间10~15%)
  • 网络I/O(连接时间仍然很低)

为了找出进程正在做什么,我创建了minidumps.

我设法创造了两个相隔20秒的MemoryDumps.这是第一个的输出:

!threadpool
CPU utilization 6%
Worker Thread: Total: 95 Running: 72 Idle: 23 MaxLimit: 200 MinLimit: 100
Work Request in Queue: 1
--------------------------------------
Number of Timers: 64
Run Code Online (Sandbox Code Playgroud)

和第二个的输出:

!threadpool
CPU utilization 9%
Worker Thread: Total: 111 Running: 111 Idle: 0 MaxLimit: 200 MinLimit: 100
Work Request in Queue: 1589
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,队列中有很多请求.

问题1:队列中有1589个请求是什么意思.这是否意味着阻止了什么?

!threadpool列表主要包含以下条目:未知函数:6a2aa293上下文:01cd1558 AsyncTimerCallbackCompletion TimerInfo @ 023a2cb0

如果我深入了解AsyncTimerCallbackCompletion

!dumpheap -type TimerCallback
Run Code Online (Sandbox Code Playgroud)

然后我查看TimerCallback中的对象,其中大多数都是类型:

System.Web.SessionState.SessionStateModule
System.Web.Caching.CacheCommon
Run Code Online (Sandbox Code Playgroud)

问题2:这些物体是否具有计时器,是否有任何意义?我应该阻止这个.如何?

主要问题我是否错过任何明显的问题,为什么我排队连接而不是最大化CPU?


我成功地在高峰时期制造了一个故障转移装置.用debugdiag分析它给了我这个警告:

Detected possible blocking or leaked critical section at webengine!g_AppDomainLock owned by thread 65 in Hang Dump.dmp
Impact of this lock
25.00% of threads blocked
(Threads 11 20 29 30 31 32 33 39 40 41 42 74 75 76 77 78 79 80 81 82 83)

The following functions are trying to enter this critical section
webengine!GetAppDomain+c9

The following module(s) are involved with this critical section
\\?\C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\webengine.dll from Microsoft Corporation
Run Code Online (Sandbox Code Playgroud)

快速谷歌搜索不会给我任何结果.有人有线索吗?

was*_*igh 4

处理队列的工作进程是真正的破坏者。可能与调用同一主机上的 Web 服务的网站连接。从而造成一种僵局。

我将 machine.config 更改为以下内容:

<processModel
        autoConfig="false"
        maxWorkerThreads="100"
        maxIoThreads="100"
        minWorkerThreads="50"
        minIoThreads="50" />
Run Code Online (Sandbox Code Playgroud)

标准此 processModel 设置为 autoConfig="true"

使用新配置,网络服务器处理请求的速度足够快,不会排队。