9

我目前在生产环境中遇到一些挂起,经过一番调查,我看到很多请求在应用程序池的工作进程中排队。共同点是每个排队时间长的请求都是一个web api请求,我在应用程序中同时使用了MVCWeb API

请求排队大约 3 小时,当应用程序池被回收时,它们立即开始排队。

它们都处于ExecuteRequestHandler状态

关于我应该在哪里继续挖掘的任何想法?

4

2 回答 2

5

您的请求可能由于多种原因而被搁置:

  • 他们正在等待 I/O 操作,例如数据库、Web 服务调用
  • 他们正在对大型数据集进行循环或执行操作
  • cpu密集型操作
  • 以上的一些组合

为了找出您的请求在做什么,首先要获取需要很长时间的请求的 url。

您可以在 cmd 行中执行此操作,如下所示

c:\windows\system32\inetsrv\appcmd list requests

如果从 url 和查看代码中不明显,您需要在服务器上执行 w3wp.exe 的进程转储。有了进程转储后,您需要将其加载到 windbg 中,以便分析占用所有 cpu 周期的内容。掩盖 windbg 是相当大的,但这里简要介绍一下您需要做的事情:

  • 加载 SOS dll(托管调试扩展)
  • 调用 !runaway 命令
  • 获取长时间运行的线程列表,通过选择它并调用 !clrstack 命令潜入一个长时间运行的线程

有很多关于使用 windbg 的博客。这是一个例子。Tess Ferrandez 的博客是分析这些类型问题的重要资源。

于 2016-07-11T11:08:37.763 回答
0

这是一个非常长的镜头,没有第一手访问您的系统,但尝试检查 IIS 管理器 gui 中的处理程序映射以获取您的 WebApi。将其与 DEV 的 IIS 设置或它工作的任何其他环境进行比较。

如果这不是问题,则对该应用程序的所有其他 IIS 设置进行比较。

祝你好运。

于 2016-07-08T01:34:06.323 回答