3

是否可以将 IIS 配置为可以在 HTTP 流水线模式下并行处理到达同一 TCP 套接字的多个 HTTP 请求?

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

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

4

3 回答 3

4

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

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

去:

  1. Internet 信息服务 > 应用程序池
  2. 选择正在使用的池(每个站点应该有一个池)
  3. 单击高级设置...
  4. 找到“Maximum Worker Processes”,然后摇晃那个傻瓜!

您现在将其推送到的进程数量完全取决于您的系统有多少 RAM。您当然可以自己监控和控制。

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

于 2013-07-22T07:27:07.743 回答
4

IIS 使用HTTP 服务器 api(即使用 HTTP.sys);所以我做了一个简单的测试——

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

看起来 HTTP.sys 实际上是在单个连接上对 IIS 的请求进行序列化;我在 HTTP.sys 上找不到任何可能修改此行为的配置。

于 2015-01-18T01:45:38.287 回答
3

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

正如您所看到的,来自网络上所有用户的请求刚刚被添加到队列中,并且正在建立和建立(绿色) - 只有 1 个请求正在执行(蓝色)。

这并不能真正回答这个问题——但它很好地说明了这种灾难性的情况。

于 2014-03-13T06:46:44.183 回答