信号器自托管在红隼

时间:2018-04-06 13:56:54

标签: asp.net-core signalr owin

我遇到了一个我开发的应用程序的奇怪问题。该应用程序是托管在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限制并且我很好

2 个答案:

答案 0 :(得分:1)

这可能是问题,但不太可能。在dotnet核心托管时,您可能使用Kestrel作为Web服务器实现,要切换这些限制(如并发连接),您可以使用此Microsoft article中所述的KestrelServerLimits类。

KestrelServerLimits不应该导致任何问题,因为ConcurrentConnections的默认值是无限制的。

答案 1 :(得分:1)

经过反复试验,我已经能够识别并纠正问题,但这并不是一件容易的事,所以如果有人偶然发现相同的问题,我将把这个答案留在后面。

禁用SignalR不能解决问题,但是使它出现的频率降低了。

由于在服务器和IIS上进行了监视,因此我发现当与站点的连接数开始快速增长时,出现了问题。该系统主要向其他服务发出请求,因此它没有数据库,也没有昂贵的计算。

检查代码,我发现存在三个问题:

  • 为每个请求创建了一个新的HttpClient,它可以耗尽请求之间无法重用的套接字blog blog2 blog3
  • 默认情况下,httpClient上最多有一个并发连接到单个域,并且此限制默认设置为2(!!!)blog4
  • 该代码正在每个Web请求上同步等待到另一个系统(此程序是从一个mvc4站点移植的,该站点从未显示此问题)。这在MVC中工作得很好,但是asp.net核心对此非常敏感,因为它将迅速耗尽所有可用线程,并且由于线程池以核心数量开始,因此它们将很快耗尽,从而使所有请求都处于等待状态。可以使用 ThreadPool.SetMaxThreads(Int32,Int32)作为临时停止间隙解决方案来增加此值,但是唯一的解决方案是转换异步调用中的所有调用。

一旦所有调用均被mde异步处理,则该问题永不会返回。基本上,问题是由于线程池饥饿以及与MVC相比,aspnet内核对其敏感。 Here使用PerfView可以找到很好的解释和检测方法。