IIS ASP.net应用程序突然挂起请求

时间:2016-11-05 11:24:52

标签: c# asp.net .net iis signalr

我们有一个运行在IIS 8.5上的asp.net应用程序,当流量很高时,间歇性地运行大约1分钟,"请求队列"开始增长并且处理器时间减少,请查看性能监视器图表:

red one is the processor time and green, request queue

奇怪的是,没有应用程序重启,503或IIS回收发生,那么它会是什么?什么突然使IIS挂起请求一段时间?除了图表,你可以看到Windows的内存看起来还不错而且稳定。

以下是一些环境配置: APP池队列长度:10000(没有503,所以我不认为可能是这个)

Asp.net config:

 <system.web>
     <applicationPool maxConcurrentRequestsPerCPU="999999" />
 </system.web>

machine.config中:

<processModel autoConfig="false" requestQueueLimit="250000"/>

我们以这种方式配置,因为我们的应用程序使用了很多SignalR。

该应用程序使用Azure SQL Server和Azure Redis,但这不是问题,因为另一台虚拟机(具有相同的APP)在同一时刻没有显示问题。

另一个提示是:在同一个虚拟机中,我们拥有相同的APP,但在另一个应用程序池和另一个行为相同的域中。

任何帮助都会受到赞赏,这让我发疯了。

谢谢!

4 个答案:

答案 0 :(得分:1)

您是否遵循了有关配置Redis提供的线程池增长设置的建议,请参阅here。有类似的问题。

答案 1 :(得分:1)

在你所描述的环境中,我将会看到以下几点

  1. 查看Azure SQL服务器的DTU百分比,如果您的信号器 操作与数据库有关。试试吧 在DTU Scale中升级以处理突发。 DTU
  2. 对于具有多个虚拟机的信号器的应用程序(假设负载平衡),您是否有中央信号服务器或每个服务器都充当信号服务器?
  3. 如果您可以安装NewRelic或类似的,它将指向问题的来源。

    希望它有所帮助。

答案 2 :(得分:1)

当问题发生时,您可以对进程进行内存转储(一种方法是使用任务管理器),但如果计算机上运行多个IIS应用程序池,则找到正确的进程以获取内存转储的可能性是非平凡的。

如果您有Visual Studio Enterprise,那么它将为您提供一个很好的UI来分析转储。它将显示运行该进程的所有线程以及内存转储时callstack的内容。您可能会发现大多数.NET线程都有类似的callstack,这可能是造成瓶颈的原因。

如果您没有Visual Studio Enterprise,我认为您仍然可以使用WinDbg打开它,但它是一个CLI工具,我不知道这些命令,因此您需要查找它。

答案 3 :(得分:1)

在图表中添加另一个计数器:私有字节。此数字将告诉您所有托管堆中的所有字节数+非托管字节数。如果这个数字不断增加,那么你的内存就会泄漏。确保所有一次性物品都处理妥当,并且物品在收集G3之前不能存活。无论如何,我会从那里开始,如果这是问题,我会开始调查,看看是什么泄漏。