【问题标题】:Maximum concurrent requests in signalr self hosted in kestrel信号器中自托管在红隼中的最大并发请求
【发布时间】:2018-04-06 13:56:53
【问题描述】:

我在开发的应用程序中遇到了一个奇怪的问题。该应用程序是托管在 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 中禁用它,问题就消失了。

第二次编辑:signalr 似乎不是cuplrit,因为在测试和生产中都使用曲柄对站点进行负载测试,直到 5000 个并发连接,这是默认的 IIS 限制,对我来说很好

【问题讨论】:

  • SignalR 2 在 Asp.Net Core 上不受支持。查看 Asp.Net Core 2.1 的新预览版。
  • 100 倍 CPU 的限制不适用于 kestrel。
  • 我知道它不受支持,我正在热切地等待 asp.net core 2.1 的发布。我还认为该限制不适用于 Kestrel,但某些事情正在使所有请求等待,这似乎是最合乎逻辑的罪魁祸首,因为它仅在 4 cpu 服务器上的 signalR 打开连接数达到 400 时才会发生
  • 我希望你没有为每个套接字连接打开一个数据库连接
  • 不,这个应用程序甚至没有数据库

标签: asp.net-core signalr owin


【解决方案1】:

经过反复试验,我已经能够识别并纠正问题,但这并不是一件容易的事,所以如果其他人偶然发现同样的问题,我会留下这个答案。

禁用 SignalR 并没有解决问题,但它减少了它的出现频率。

感谢服务器和 IIS 上的监控,我观察到当与站点的连接数量开始快速增长时,问题就出现了。该系统主要向其他服务发出请求,因此它没有数据库,也没有昂贵的计算。

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

  • 为每个请求创建了一个新的HttpClient,它可以耗尽请求之间未重用的套接字blogblog2blog3
  • 默认情况下,httpClient 上单个域的最大并发连接数默认设置为 2 (!!!)blog4
  • 代码在对另一个系统的每个 Web 请求上同步等待(该程序是从一个从未显示过此问题的 mvc4 站点移植的)。这在 MVC 中运行良好,但 asp.net 核心对此非常敏感,因为它会迅速耗尽所有可用线程,并且因为线程池以核心数量开始,它们将很快耗尽,使所有请求等待。可以使用 ThreadPool.SetMaxThreads(Int32, Int32) 作为临时权宜之计增加此值,但唯一的解决方案是在异步调用中转换所有调用。

一旦所有调用都是 mde async,问题就永远不会返回。基本上问题是由于线程池饥饿和aspnet核心对它与MVC的敏感性。 Here你可以找到一个很好的解释和使用PerfView的检测方法。

【讨论】:

    【解决方案2】:

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

    KestrelServerLimits 不会给您带来任何问题,因为 ConcurrentConnections 的默认值是无限制的。

    【讨论】:

      猜你喜欢
      • 2014-12-12
      • 2019-08-09
      • 2018-02-18
      • 2017-10-19
      • 1970-01-01
      • 2022-01-11
      • 2020-03-31
      • 2018-03-25
      • 2022-10-16
      相关资源
      最近更新 更多