Web Api请求永远在IIS上排队(状态:ExecuteRequestHandler)

Esc*_*ar5 5 iis request request-queueing asp.net-web-api iis-8

我目前正在生产环境中遇到一些问题,经过一些调查后,我发现很多请求在应用程序池的工作进程中排队.常见的是,长时间排队的每个请求都是web api请求,我在应用程序中同时使用MVCWeb API.

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

它们都处于ExecuteRequestHandler状态

我应该继续挖掘哪些想法?

Avn*_*ner 5

您的请求可能因多种原因而停滞:

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

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

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

c:\windows\system32\inetsrv\appcmd list requests
Run Code Online (Sandbox Code Playgroud)

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

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

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