IIS和HTTP管线化,同时处理请求

3
有没有可能配置IIS,使其能够在HTTP流水线模式下同时处理同一TCP套接字上到达的多个HTTP请求?
我们的问题在于Web客户端在单个TCP套接字上使用HTTP流水线进行多个请求。客户端基本上一次发送10个请求,然后服务器发送10个响应(按照请求的顺序)。我们的服务器对每个请求都需要相当长的时间,主要是等待外部IO。如果IIS可以并行处理所有10个请求,然后将响应以正确的顺序序列化回客户端,那么效率会大大提高。显然,如果例如第3个响应早于第2个响应可用,服务器需要某种方式来缓存响应。
这是否有可能?也许在IIS中不可能,或者我只是搜索错误的关键字...我们正在运行Windows Server 2008 R2上的IIS 7.5和ASP.NET 4.5。
3个回答

4
我们在IIS 7.5中遇到了同样的问题。我们的解决方案是启用"Web Garden"...它确实非常有效!只是你不能有一个基于"session"的网站。所以如果你有客户登录,你将不得不重新配置进程。(我们使用cookie来存储加密令牌 - 无论如何,那都不重要)。
请按照以下步骤操作:
1. 进入"Internet Information Service > 应用程序池"。 2. 选中正在使用的池(每个网站应该有一个池)。 3. 点击"高级设置..."。 4. 找到"最大工作进程数"并增加数量。
现在,你可以将进程数增加到系统可用内存的最大限制。当然,你可以自行监控和控制这一过程。
通过启用"Web Garden",你将会注意到(IIS使用"进程资源管理器"或类似的工具),对于每个请求,IIS都会生成一个新的w3wp.exe实例,直到达到你指定的最大数量。新请求将简单地由下一个可用的工作进程处理,从而实现真正的IIS并行请求处理。如果两个请求在短时间内同时到达,并且请求2在请求1之前完成,则请求2将发送其响应。

我怀疑 Web Garden 模式与 HTTP 管道化没有任何关系。也许它只是允许你解决应用程序中的跨请求阻塞 bug。 - usr

4

IIS使用HTTP服务器API(使用HTTP.sys); 所以我进行了一个简单的测试 -

我观察到,如果在服务器上两次调用HttpReceiveHttpRequest(没有为第一个请求发送响应),它将无法接收第二个请求(基本上,第二个调用会阻塞)。这对PUTGET请求都是正确的。

看起来HTTP.sys实际上正在将请求序列化到单个连接上的IIS;我找不到任何有关HTTP.sys的配置信息,可以修改这个行为。


3

这是一个令人印象深刻的IIS失败示例图。

正如你所看到的,所有来自 Web 上的用户请求都只是在队列中排队等待(绿色),只有一个请求正在执行(蓝色)。

虽然这并没有真正回答问题,但这是一个非常生动形象的展示这种灾难性情况的例子。


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