在排查ASP.NET网站High CPU问题时, 经常使用hang dump来确定常规手段难以发现的原因.
经常会使用!aspxpages命令来查看当前进程中都有那些资源正被请求, 被请求的资源都运行了多久. 这个命令的输出样本如下.
0:000> !aspxpages
Going to dump the HttpContexts found in the heap.
Loading the heap objects into our cache.
HttpContext Timeout Completed Running ThreadId ReturnCode Verb RequestPath+QueryString0x0000000101d43c10 110 Sec yes XXX 200 POST /_vti_bin/Lists.asmx
0x0000000101d5ae68 110 Sec yes XXX 200 POST /_vti_bin/Lists.asmx
0x0000000101d6e7a0 110 Sec yes XXX 200 POST /_vti_bin/search.asmx0x0000000107c5baa0 110 Sec no 18 Sec 78 200 GET /Pages/Home.aspx
0x000000010ab794f0 110 Sec no 10 Sec 90 200 GET /pages/home.aspx
......
Total 1,042 HttpContext objects
假如只看已经列出来的信息的话, 结论如下:
- 三个对于web service的访问已经成功结束. 之所以列在这里, 乃是因为抓dump的时候, 还没有进行垃圾收集, 这些对象还依然存在于内存中. 因为运行已经结束, 所以线程ID显示为XXX,
- 两个对aspx页面的访问还正在运行, 可以看到他们的线程ID分别是78和90。 并且分别已经运行了18秒和10秒.
注意, !aspxpages与!dumphttpcontext命令是一致的.