IIS和HTTP流水线操作,并行处理请求

时间:2013-06-25 14:05:38

标签: http iis-7

是否可以以这样的方式配置IIS,使其能够处理多个HTTP请求,这些HTTP请求以HTTP流水线模式并行地到达同一个TCP套接字?

我们遇到一个问题,即使用HTTP流水线操作在单个TCP套接字中由Web客户端完成多个请求。客户端基本上一次发送10个请求,然后服务器发送10个响应(按照与请求相同的顺序)。我们的服务器每个请求都需要相当长的时间,主要是等待外部IO。如果IIS可以开始并行处理所有10个请求,然后以正确的顺序将响应序列化回客户端,那么效率会更高。显然,服务器需要一些方法来缓存响应,例如,响应3早于响应2可用。

这有可能吗?也许这在IIS中是不可能的,或者我只是在搜索错误的关键字......我们在Windows Server 2008 R2上运行IIS 7.5和ASP.NET 4.5。

3 个答案:

答案 0 :(得分:3)

我们在IIS 7.5中遇到了同样的问题。

我们的解决方案是启用“Web Garden”......它确实非常有效!只是你不能拥有一个基于“会话”的网站。因此,如果您有客户“登录”,则必须重新配置该过程。 (我们使用cookie来存储加密的令牌 - 无论如何除了这一点之外)。

转到:

  1. 互联网信息服务>应用程序池
  2. 选择正在使用的池(每个站点应该有一个池)
  3. 点击高级设置...
  4. 找到“最大工人进程”并发出傻逼!
  5. 您将其推送到现在的进程数量完全取决于您的系统具有多少RAM。你当然可以监控自己。

    启用“Web Garden”后,您会注意到(使用Process Explorer或类似的东西),IIS将为每个请求生成一个新的w3wp.exe实例,最多为您指定的最大数量。新请求只是由下一个可用的工作进程处理,从而实现真正的IIS并行请求处理。如果两个请求在彼此之间进入,并且请求2在请求1之前完成,则请求2发送其响应。

答案 1 :(得分:2)

This is an impressive illustration of the IIS fail.

正如您所看到的那样,来自网络上所有用户的请求只是被添加到队列中,并且累积起来(绿色) - 只有一个请求正在执行(蓝色)。

这并没有真正回答这个问题 - 但它是这个灾难性局面的一个美丽例证。

答案 2 :(得分:2)

IIS使用HTTP server api(使用HTTP.sys);所以我做了一个简单的测试 -

我观察到如果我在服务器上调用HttpReceiveHttpRequest两次(没有发送第一个请求的响应),它就不会收到第二个请求(基本上是第二个调用块)。这适用于PUTGET请求。

似乎HTTP.sys实际上是在单个连接上将请求序列化到IIS;我找不到任何可能会修改此行为的configuration on HTTP.sys