【问题标题】:IIS performance problem trying to implement an XMPP-like protocol尝试实现类似 XMPP 的协议的 IIS 性能问题
【发布时间】:2010-09-12 12:14:42
【问题描述】:

我们有一个客户端,它需要从服务器获取交互式消息,这些客户端分布在世界各地的各种防火墙后面并关闭了各种端口。我们唯一可以依赖的是 HTTP 端口 80(和 HTTPS 443)。

该设计基本上仿照 XMPP(Jabber 协议),使用我们的客户端和 IIS。客户端向 .NET 处理程序发出 GET 请求;处理程序将请求保持打开一段时间以查找消息。如果有任何消息到达,它们会立即发送给客户端;如果不是,则在超时后,连接会以“无数据”响应关闭。客户端立即重新打开通信。

嗯,理论上来说。

实际发生的情况是,首先,IIS 不能同时处理超过 100 个请求 - 其他请求都在排队,并且在“已连接”和 IIS 识别到客户端调用之间可能会有几分钟的延迟。第二,关于客户端超时而服务器没有任何响应的一半时间(客户端超时比服务器长五分钟)。

POST 总是有效的。在同一 Web 服务器上提供的其他数据可以正常工作。 Web 服务在同一台服务器上工作。这是 Windows 2K3 Server 上的开箱即用安装。

是否有我们缺少的配置选项,或者我应该看看其他什么来解决这个问题?

谢谢。

【问题讨论】:

    标签: performance iis httphandler xmpp


    【解决方案1】:

    开箱即用,Windows 需要一些调整。我不得不在 asp.net 中实现一个彗星服务器并遇到了一些愚蠢的默认设置。阅读这些链接后:

    我对我们的 Windows 2k8 服务器进行了以下更改。

    • reg add HKLM\System\CurrentControlSet\Services\HTTP\Parameters /v MaxConnections /t REG_DWORD /d 1000000 /f
    • reg add HKLM\System\CurrentControlSet\Services\TcpIp\Parameters /v TcpTimedWaitDelay /t REG_DWORD /d 30 /f
    • reg add HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0 /v MaxConcurrentThreadsPerCPU /t REG_DWORD /d 0 /f
    • reg add HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0 /v MaxConcurrentRequestsPerCPU /t REG_DWORD /d 30000 /f
    • appcmd.exe set apppool "[app pool name]" /queueLength:65535
    • appcmd.exe 设置配置 /section:serverRuntime /appConcurrentRequestLimit:100000
    • reg add HKLM\System\CurrentControlSet\Services\TcpIp\Parameters /v MaxUserPort /t REG_DWORD /d 65534 /f
    • reg add HKLM\System\CurrentControlSet\Services\TcpIp\Parameters /v MaxFreeTcbs /t REG_DWORD /d 2000 /f
    • reg 添加 HKLM\System\CurrentControlSet\Services\TcpIp\Parameters /v MaxHashTableSize /t REG_DWORD /d 2048 /f reg add HKLM\System\CurrentControlSet\Services\InetInfo\Parameters /v MaxPoolThreads /t REG_DWORD /d 80 /f
    • appcmd 设置配置 /section:processModel /requestQueueLimit:100000 /commit:MACHINE

    我不知道是否所有更改都是必需的或最佳的,但通过对测试服务器的一些快速测试,我们实现了超过 30k 的执行连接和每秒 5k 的请求。无法更进一步,因为我用完了客户端机器来运行测试。

    【讨论】:

      【解决方案2】:

      XMPP 从来都不是为高性能应用程序而设计的。消息必须遍历整个堆栈到达应用层,并且有大量的 XML 解析。您是否考虑过使用 XMPP 之外的其他标准?

      【讨论】:

      • “XMPP 从来都不是为高性能应用程序设计的。”我不知道您所说的“高性能”是什么意思,但它是为聊天而设计的,并且做得非常好,这就是 OP 所要求的。例如,ejabberd 可以同时处理数十万个请求。
      【解决方案3】:

      我认为您正在达到 ASP.NET 线程池的限制,而不是 IIS 的限制。研究创建异步 HTTP 处理程序 (IHttpAsyncHandler),因为当它们阻塞/等待时,它们不会占用线程池(它们使用完成端口)。

      更新:最近遇到这个似乎与我的想法一致:CodeProject: Scalable COMET Combined with ASP.NET

      【讨论】:

        【解决方案4】:

        如果 IIS 不符合您的要求,您应该选择另一个 Web 服务器,例如 Apache(与 Mod_mono)或 LightTPD

        顺便说一句,您可以使用 XMPP Over BOSH 通过 HTTP 隧道传输 XMPP。无需发明自定义协议。

        【讨论】:

          猜你喜欢
          • 2011-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多