在ASP.NET 4.5中限制WebSocket的性能因素?

时间:2012-04-02 19:30:33

标签: c# asp.net html5 websocket

MSDN文档似乎没有很好地覆盖ASP5 4.5对HTML5 WebSockets protocol的支持!

这就是我要找的:

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

更新

可以在Adobe Media Server应用服务器上很好地配置来自flash RTMP套接字的请求(websocket的替代方案)。对于应用程序或IIS 8配置中的ASP.net,请求数量,理想时间,块大小......是不是有任何配置?

2 个答案:

答案 0 :(得分:34)

对于任何可能感兴趣的人:

  • 可以对单个服务器进行超过100k的WebSocket连接 运行ASP.NET 4.5
  • WebSocket连接由HTTP发起 握手,因此有些IIS throttles that apply to HTTP requests 也适用于WebSockets。 IIS配置中的appConcurrentRequestLimit可用于设置每个应用程序的最大并发请求数:

    <serverRuntime appConcurrentRequestLimit="250000" />
    
  • 可以使用ApplicationPool's maxConcurrentRequestsPerCPU属性设置与ASP.net 4 Web应用程序的最大并发连接数:

    <system.web>
        <applicationPool maxConcurrentRequestsPerCPU="20000" />
    </system.web>
    
  • 当总连接数超过时 maxConcurrentRequestsPerCPU设置,ASP.NET将使用队列启动限制请求。要控制队列的大小,您可以 调整machine.config requestQueueLimit

    <processModel autoConfig="false" requestQueueLimit="250000" />
    
  • 应考虑以下性能计数器 进行并发测试并调整最佳设置 详细说明:

    • NET CLR Memory #bytes in all Heaps
    • ASP.NET \请求当前 - 已排队 - 已拒绝
    • 处理器信息\处理器时间
    • 建立TCP / IP连接
    • Web服务\当前连接 - 最大连接数
    • .NET CLR LocksAndThreads \#当前逻辑线程 - 当前物理线程数

答案 1 :(得分:0)

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

.Net可以处理的套接字数量取决于系统和服务套接字的方式。阅读:http://msdn.microsoft.com/en-us/library/windows/desktop/ms739169%28v=vs.85%29.aspx

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

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

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

客户端套接字可以与您的实现和内存可以处理的一样多。

有许多服务套接字的方法,可以让你处理更多的套接字。 几个亮点:

  1. 阻止服务套接字的方式将延迟服务每个套接字。同样,客户端套接字的非阻塞读取将使用您的cpu来检查是否有可用的数据。有了大量的插座,它可以非常省钱。

  2. 每个客户端套接字的线程将使用大量内存(每个线程超过1mb),这将允许每个物理系统使用少量套接字。

  3. 最好的(imho)选项之一是使用异步套接字。这使得你可以拥有数千个套接字,并且在单个服务器系统上实现了数十甚至数十万个套接字。