试图执行类似XMPP协议的IIS性能问题

时间:2020-03-06 14:37:22  来源:igfitidea点击:

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

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

好吧,理论上。

实际发生的情况是,首先,IIS不能处理大约100个以上的并发请求,而其他请求都已排队,并且"已连接"和IIS识别出客户端已入站之间可能会有几分钟的间隔。其次,大约是一半的时间。客户端超时,而服务器没有任何响应(客户端超时比服务器长五分钟)。

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

是否有我们缺少的配置选项,或者还有其他应解决的选项吗?

谢谢。

解决方案

如果IIS不符合要求,则应选择其他Web服务器,例如Apache(带有Mod_mono)或者LightTPD。

顺便说一句,我们可以使用BOSH上的XMPP通过HTTP传输XMPP。无需发明自定义协议。

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

更新:最近遇到了这个问题,这似乎与我的想法一致:CodeProject:可扩展的COMET与ASP.NET结合

XMPP从未设计用于高性能应用程序。消息必须遍历整个堆栈到达应用程序层,并且有很多XML解析。我们是否考虑过使用XMPP以外的其他标准?

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

  • 实现IHttpAsyncHandler的通用处理程序(.ashx)的IIS 7.0 503错误
  • http://blogs.technet.com/b/winserverperformance/archive/2008/07/25/tuning-windows-server-2008-for-php.aspx
  • http://smallvoid.com/article/winnt-tcpip-max-limit.html
  • http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/rprf_plugin.html
  • http://support.microsoft.com/kb/820129
  • http://msdn.microsoft.com/zh-CN/library/ee37705(BTS.10).aspx
  • http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx

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

  • reg添加HKLM \ System \ CurrentControlSet \ Services \ HTTP \ Parameters / v MaxConnections / t REG_DWORD / d 1000000 / f
  • reg添加HKLM \ System \ CurrentControlSet \ Services \ TcpIp \ Parameters / v TcpTimedWaitDelay / t REG_DWORD / d 30 / f
  • reg添加HKLM \ SOFTWARE \ Microsoft \ ASP.NET \ 2.0.50727.0 / v MaxConcurrentThreadsPerCPU / t REG_DWORD / d 0 / f
  • reg添加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添加HKLM \ System \ CurrentControlSet \ Services \ TcpIp \ Parameters / v MaxUserPort / t REG_DWORD / d 65534 / f
  • reg添加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的执行连接和每秒5000的请求。无法走得更远,因为我用光了客户端计算机来运行测试。