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

C# IIS ASP.net应用程序突然挂起请求,c#,asp.net,.net,iis,signalr,C#,Asp.net,.net,Iis,Signalr,我们有一个asp.net应用程序在IIS 8.5上运行,当出现高流量时,大约1分钟内,“请求队列”开始增长,处理器时间减少,请查看性能监视器图表: 奇怪的是,没有应用程序重启、503或IIS循环发生,那么这可能是什么呢?是什么突然让IIS暂停请求一段时间?除了图形,您还可以看到Windows的内存看起来正常且稳定 以下是一些环境配置: 应用程序池队列长度:10000(没有503,所以我认为可能不是这个) Asp.net配置: <system.web> <appli

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

奇怪的是,没有应用程序重启、503或IIS循环发生,那么这可能是什么呢?是什么突然让IIS暂停请求一段时间?除了图形,您还可以看到Windows的内存看起来正常且稳定

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

Asp.net配置:

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

machine.config:

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

我们这样配置是因为我们的应用程序使用了很多信号器

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

另一个技巧是:在同一个VM中,我们有相同的应用程序,但在另一个应用程序池和另一个行为相同的域中

任何帮助都将不胜感激,这让我发疯


谢谢

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

在您描述的环境中,我将看以下几点

  • 查看Azure SQL server的DTU百分比,如果您的信号器 操作与数据库无关。试着去一个 在DTU刻度中调平以处理突发事件
  • 对于具有多个虚拟机的signalr的应用程序(假设负载平衡),您是否有中央signalr服务器或每个服务器作为signalr服务器 若您可以安装NewRelic或类似的软件,它将指出问题的根源


    希望它有帮助。

    当问题发生时,您可以对进程进行内存转储(一种方法是使用任务管理器),尽管如果计算机上运行多个IIS应用程序池,找到正确的进程进行内存转储可能并不简单

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


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

    在图形中添加另一个计数器:专用字节。此数字将告诉您所有托管堆中的所有字节数+非托管字节数。如果这个数字持续增加,那么你的某个地方有内存泄漏。确保正确处置所有一次性物品,并且物品在G3收集之前不会保存。无论如何,我会从那里开始,如果这是一个问题,我会开始调查,看看有什么泄漏。

    您是否已经在应用程序中查找了问题?有没有办法让它死锁?它是否连接到数据库服务器?数据库还可用吗?嗨@Peter,应用程序非常庞大,我们需要一些提示来开始查看。这与数据库无关,因为另一个虚拟机不会在同一时刻显示此问题。请尝试了解应用程序挂起时正在执行的操作。process explorer的threads选项卡可能是一个esay开始:我在上面添加了更多信息。你认为线程已经达到极限并挂起应用程序了吗?@Alexandre正在检查,没有选择其他扩展选项?因为您的情况(如果不是应用程序死锁)是99.9%的扩展问题。我们最近遇到了同样的问题。是的,我在问题中描述了这一点。