3

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

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

嗯,理论上。

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

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

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

谢谢。

4

4 回答 4

3

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

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

于 2008-09-25T23:15:26.713 回答
1

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

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

于 2008-09-24T01:47:31.637 回答
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
  • 注册添加 HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0 /v MaxConcurrentThreadsPerCPU /t REG_DWORD /d 0 /f
  • 注册添加 HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0 /v MaxConcurrentRequestsPerCPU /t REG_DWORD /d 30000 /f
  • appcmd.exe 设置 apppool "[应用程序池名称]" /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 add 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 的请求。无法更进一步,因为我用完了客户端机器来运行测试。

于 2010-08-28T23:57:46.153 回答
0

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

于 2010-08-24T21:19:42.977 回答