我们有一个运行在IIS 8.5上的asp.net应用程序,当流量很高时,间歇性地运行大约1分钟,"请求队列"开始增长并且处理器时间减少,请查看性能监视器图表:
奇怪的是,没有应用程序重启,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,但在另一个应用程序池和另一个行为相同的域中。
任何帮助都会受到赞赏,这让我发疯了。
谢谢!
答案 0 :(得分:1)
您是否遵循了有关配置Redis提供的线程池增长设置的建议,请参阅here。有类似的问题。
答案 1 :(得分:1)
在你所描述的环境中,我将会看到以下几点
如果您可以安装NewRelic或类似的,它将指向问题的来源。
希望它有所帮助。
答案 2 :(得分:1)
当问题发生时,您可以对进程进行内存转储(一种方法是使用任务管理器),但如果计算机上运行多个IIS应用程序池,则找到正确的进程以获取内存转储的可能性是非平凡的。
如果您有Visual Studio Enterprise,那么它将为您提供一个很好的UI来分析转储。它将显示运行该进程的所有线程以及内存转储时callstack的内容。您可能会发现大多数.NET线程都有类似的callstack,这可能是造成瓶颈的原因。
如果您没有Visual Studio Enterprise,我认为您仍然可以使用WinDbg打开它,但它是一个CLI工具,我不知道这些命令,因此您需要查找它。
答案 3 :(得分:1)
在图表中添加另一个计数器:私有字节。此数字将告诉您所有托管堆中的所有字节数+非托管字节数。如果这个数字不断增加,那么你的内存就会泄漏。确保所有一次性物品都处理妥当,并且物品在收集G3之前不能存活。无论如何,我会从那里开始,如果这是问题,我会开始调查,看看是什么泄漏。