ASP.NET 4.5中WebSocket的性能限制因素是什么?

27

MSDN文档似乎没有很好地涵盖ASP.net 4.5对HTML5 WebSockets协议的支持!

这就是我正在寻找的:

  • 服务器/应用程序/CPU能够支持多少活动连接?
  • 是否有任何可以设置/获取的传入连接的最大数量?
  • 无论通过套接字传输的数据如何,每个应用程序的最佳套接字数量是多少?

更新:

来自Flash RTMP套接字的请求(WebSocket的替代方法)可以在Adobe Media Server应用程序服务器上进行良好的配置。在应用程序或IIS 8配置中,ASP.net是否有任何请求数、理想时间、块大小等方面的配置?


2
我想大多数情况下这些都将是“软因素”(例如服务器/网络负载的函数),除非在某个地方配置了“硬限制”。 - user166390
1
你有看过SignalR吗?https://github.com/SignalR/SignalR - mgnoonan
@mgnoonan:不,我没有看过它,但它似乎是第三方的 .net 库。我要找的是 asp.net 4.5 中原生支持 websocket 的功能及其可能存在的限制。 - Kamyar Nazeri
@pst:理论上讲,它可能是无限的吗?这似乎不太对,因为应用程序池中的HTTP请求数量是有限制的,我想知道套接字的数量是否也可以在应用程序/IIS应用程序池中受到限制? - Kamyar Nazeri
1
ASP.NET有许多内置限制,在尝试WebSocket可扩展性时需要放松这些限制。SignalR的开发人员有一个很好的指南:https://github.com/SignalR/SignalR/wiki/Performance。 - Paul Batum
相关:https://dev59.com/cYvda4cB1Zd3GeqPYFmR - Janez Kuhar
2个回答

40

致关注此事者:

  • Over 100k WebSocket connections can be made to a single server running ASP.NET 4.5
  • WebSocket connections are initiated by a HTTP handshake, hence some of the IIS throttles that apply to HTTP requests will also apply to WebSockets. appConcurrentRequestLimit in the IIS Configuration can be used to set the maximum concurrent requests per application:

    <serverRuntime appConcurrentRequestLimit="250000" />
    
  • Maximum concurrent connections to an ASP.net 4 Web Application can be set with ApplicationPool's maxConcurrentRequestsPerCPU property:

    <system.web>
        <applicationPool maxConcurrentRequestsPerCPU="20000" />
    </system.web>
    
  • When the total amount of connections exceed the maxConcurrentRequestsPerCPU setting, ASP.NET will start throttling requests using a queue. To control the size of the queue, you can tweak the machine.config requestQueueLimit:

    <processModel autoConfig="false" requestQueueLimit="250000" />
    
  • The following performance counters should be considered while conducting concurrency testing and adjusting the optimum settings detailed above:

    • NET CLR Memory #bytes in all Heaps
    • ASP.NET\Requests Current - Queued - Rejected
    • Processor Information\Processor Time
    • TCP/IP Connections Established
    • Web Service\Current Connections - Maximum Connections
    • .NET CLR LocksAndThreads\ # of current logical Threads - # of current physical Threads

1
WebSocket连接(也就是握手后)是否在这些参数的意义上算作“并发请求”? - John
1
WebSocket(即使处于空闲状态)是一种持久连接,因此它们确实可以被视为并发请求。 - Kamyar Nazeri
从技术上讲,是的,但语义不同。WebSocket连接旨在保持打开状态而不消耗资源,而HTTP请求几乎总是在运行时消耗资源。这就是为什么对于两种类型的“请求”,使用相同的限制参数并没有太多意义。由于这没有意义,因此可以合理地怀疑这里可能有一些需要指出的问题。 - John
5
使用HttpListener/OWIN,我成功在单个Azure虚拟机上通过C#的.NET Websockets进行SSL传输,实现了982Mbps的出站速率,因此吞吐量也相当不错。 - Ben Adams

0

编辑:此答案与 .Net 4.0 或更早版本相关,其中 WebSockets 必须由您自己实现(.Net 4.5 + IIS 为您提供解决方案)。因此,它仅涉及在 TCP 层之上实现 WebSockets 的自己的实现。

.Net 可处理的套接字数量基于系统和您提供套接字的方式。请阅读此文档:http://msdn.microsoft.com/en-us/library/windows/desktop/ms739169%28v=vs.85%29.aspx

WebSockets 实现使用异步方式服务数据的接收和发送。这使它们非常可扩展,并且不需要每个连接大量的内存。因此,连接的套接字数量基于应用程序逻辑与每个连接和硬件的复杂性。在大多数情况下,您将面临处理应用程序逻辑的性能问题,然后才会面临仅基于连接的套接字的性能问题。

如果您正在使用基于原始 TCP 套接字的自己的实现,则此信息将适用:

在单个网络设备上,您可以绑定少于65k个套接字。这是接受连接的侦听套接字。在通常的服务器实现中,您几乎永远不会使用超过几个或者几十个套接字来接受连接。

客户端套接字可以达到您的实现和内存所能处理的数量。

有许多方法可以服务套接字,使您能够处理更多的套接字。以下是一些亮点:

  1. 阻塞式服务套接字将延迟为每个套接字提供服务。同时,客户端套接字的非阻塞读取将仅用于检查是否有任何可用数据。对于大量的套接字,这可能非常昂贵。

  2. 每个客户端套接字一个线程将使用大量内存(每个线程超过1MB),这将允许您在物理系统上拥有少量套接字。

  3. 我认为最好的选择之一是使用异步套接字。这允许您拥有数千个套接字,并且通过良好的实现,甚至可以在单个服务器系统上拥有数万个套接字。


1
保罗,请仔细阅读: 在单个网络设备上,您可以绑定不到65k个套接字。这是接受连接的侦听套接字。 这意味着您可以绑定(所谓的“服务器套接字”)。这不适用于客户端套接字。 您可能拥有硬件、软件和操作系统可以处理的数量。这就是我所说的。 因此,您的评论是正确的:您可以拥有超过65k个客户端套接字。 再次强调:请仔细阅读答案中写的内容。并查看套接字绑定、侦听以及服务器/客户端套接字的含义。 问候。 - moka
4
Maksims,你的回答仍然存在误导性。问提出者想要了解ASP.NET 4.5 WebSockets的可扩展性。可以绑定的网络套接字数量并不与此问题相关。你将一般用途的.NET套接字编程答案复制粘贴到了一个ASP.NET WebSockets问题中。例如,你列出了阻塞套接字作为一种选择,但是.NET 4.5甚至没有公开阻塞WebSocket API。 - Paul Batum
1
WebSockets不是会话性的。 如果实现基于ASP.Net WebSockets,那么它们将依赖于一些IIS设置,但它们与HTTP请求或类似的东西无关,因为它们不是HTTP请求,而是在顶部有额外层的纯TCP连接。 - moka
2
@KamyarNazeri 是的,你需要放松一些限制。我在问题本身下发表了一条评论,链接到SignalR的指南,介绍可能会限制服务器接受多少WebSocket连接的各种限制。这是链接:https://github.com/SignalR/SignalR/wiki/Performance - Paul Batum
1
此外,Maksims 关于 WebSockets 和 HTTP 之间关系的说法是不正确的。因为 WebSocket 连接是通过 HTTP 握手来初始化的,所以一些应用于 HTTP 请求的 IIS 限制也会适用于 WebSockets。 - Paul Batum
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接