我遇到了一个我开发的应用程序的奇怪问题。该应用程序是托管在Kestrel上运行的AspNetCore 2.0的Windows服务。此应用程序通过充当代理的IIS站点接收请求。
在这个应用程序中,我还使用了使用Microsoft.AspNetCore.Owin集成的信号2.2.2。一切顺利,直到我检测到应用程序没有响应请求。
同一台计算机上的其他应用程序和使用相同的IIS服务器作为代理正常工作。重新启动为站点提供服务的应用程序池暂时解决了问题。
问题再次浮出水面并挖掘监控信息,当同一台机器上有400个信号器SSE连接时,应用程序似乎挂起。这似乎是合理的,因为我发现默认情况下OWIN限制了100 * number of cpus处的并发请求数。 (请注意,同一台计算机上的站点每分钟提供5000个请求而不会出汗,但这些请求不像SignalR那样长期存在请求)
问题是我在AspNetCore中托管Owin时似乎无法找到相同的选项。有人知道这是否可以作为解决方案以及正确的设置是什么?
编辑:我很确定这个问题是由同时打开的SignalR连接数引起的,因为在Javascript中禁用它会导致问题消失。
第二次编辑:信号器似乎不是杯子,因为在测试和生产中使用曲柄进行负载测试工作直到5000并发连接这是默认的IIS限制并且我很好
答案 0 :(得分:1)
这可能是问题,但不太可能。在dotnet核心托管时,您可能使用Kestrel作为Web服务器实现,要切换这些限制(如并发连接),您可以使用此Microsoft article中所述的KestrelServerLimits类。
KestrelServerLimits不应该导致任何问题,因为ConcurrentConnections的默认值是无限制的。
答案 1 :(得分:1)
经过反复试验,我已经能够识别并纠正问题,但这并不是一件容易的事,所以如果有人偶然发现相同的问题,我将把这个答案留在后面。
禁用SignalR不能解决问题,但是使它出现的频率降低了。
由于在服务器和IIS上进行了监视,因此我发现当与站点的连接数开始快速增长时,出现了问题。该系统主要向其他服务发出请求,因此它没有数据库,也没有昂贵的计算。
检查代码,我发现存在三个问题:
一旦所有调用均被mde异步处理,则该问题永不会返回。基本上,问题是由于线程池饥饿以及与MVC相比,aspnet内核对其敏感。 Here使用PerfView可以找到很好的解释和检测方法。