AWS 应用程序负载均衡器是不是仍然遭受客户端的 HOL 阻塞?

Posted

技术标签:

【中文标题】AWS 应用程序负载均衡器是不是仍然遭受客户端的 HOL 阻塞?【英文标题】:Does AWS Application Load balancer still suffers HOL Blocking with clients?AWS 应用程序负载均衡器是否仍然遭受客户端的 HOL 阻塞? 【发布时间】:2017-03-10 08:27:37 【问题描述】:

我们最近改用了 Amazon 的新 ALB(应用程序负载均衡器),并且很高兴能从 http2 多路复用中受益。但似乎仍然存在 HOL(线头)阻塞问题。

客户端可以并行请求图像,但仍需要等待一段时间才能开始下载图像。我猜这是因为 AWS 的 Application Load Balancer 终止了 http2,然后通过 http/1 与 ec2 实例通信,从而产生了 HOL 延迟。

我可能看错了这个图表,如果是这样,有人可以向我解释为什么内容没有更快地下载,换句话说,我希望绿色部分更小,而蓝条会更快出现。负载平衡器和 ec2 实例之间的网络 not 是否会受到 HOL 的影响?是不是发生了什么神奇的事情?

【问题讨论】:

这很有趣...你问过亚马逊他们是否使用 HTTP/1.1 与后端通信吗? 我没有,但我认为他们有,因为我们在没有 http2 模块的 ec2 机器上安装了 nginx 【参考方案1】:

我相信您所看到的可能与当前 Chrome(大约 v54)如何优先处理请求有关。

独占依赖

Chrome 使用 HTTP/2 的专有依赖项(可以在解析页面和发现新资源时动态重新排列)以使所有流严格相互依赖。这意味着所有资源一个接一个地被有效地发送。我编写了一个小实用程序来解析 chrome://net-internals/#http2 的输出,以便显示给定页面的树:https://github.com/deweerdt/h2priograph。

从流到另一个的依赖可以是独占的也可以不是。 RFC 7540 的第 5.3.1 节涵盖了该部分:https://www.rfc-editor.org/rfc/rfc7540#section-5.3.1,这是他们在将新流 D 添加到 A 时给出的示例:

非排他性:

   A                 A
  / \      ==>      /|\
 B   C             B D C

独家:

                     A
   A                 |
  / \      ==>       D
 B   C              / \
                   B   C

示例

我们以这个页面为例

Chrome 仅使用独占依赖项,因此依赖项树乍一看可能如下所示:
 html
  |
 PNG
  |
 PNG

当发现 javascript 时,Chrome 会将其重新排列在图片之上(因为 javascript 更有可能影响页面的呈现方式),因此 Chrome 将 JS 放在 HTML 的正下方:

 HTML
  |
 JS
  |
 PNG
  |
 PNG

因为所有请求都是菊花链式的,所以看起来就像您发布的瀑布图一样,请求会像在 HTTP/1 中一样一个接一个地执行,但事实并非如此,因为它们可以动态重新排序所有请求都会尽快发送到浏览器

另一方面,Firefox 将具有相同类型的资源共享相同的优先级,因此您应该能够在那里看到一些交错。

请注意,Chrome 所做的并不等同于过去使用 HTTP/1 所做的,因为所有请求都已发送到服务器,因此服务器总是有一些东西要在线发送。除此之外,排序是动态的,因此如果在页面中发现更高优先级的资源,Chrome 会重新排序优先级树,以便此新资源优先于现有的较低优先级资源。

【讨论】:

是否有任何文档可以进一步解释这一点?我不太确定我完全理解你的建议。谢谢! Chrome 的当前行为没有记录在 AFAIK 中。这个演示文稿非常好,sssslide.com/speakerdeck.com/summerwind/2-prioritization,但 Chrome 的行为从那以后发生了变化,因此该部分不再适用。有什么具体的部分我可以解释得更好吗? 我不确定“HTTP/2 的专有依赖项”是什么。让我试着给你解释一下,看看你能不能找到我理解的缺陷。 Chrome 并行发送所有请求,但会逐个下载内容,以便重新排列优先级。如果 Chrome 根据页面的解析方式或发现新资源时发现更重要的内容,它可以优先考虑该资源。 我已经更新了这篇文章以更详细地了解依赖关系,如果有帮助,请告诉我。我认为您对所发生情况的描述是正确的。 感谢您的澄清!我将赞成这个答案有帮助,但我有点犹豫是否将其标记为“正确”答案,因为这是基于对行为的观察而不是冷酷的事实。感谢您抽出宝贵时间分享您的发现!【参考方案2】:

可能会为时已晚,但仍然如此。

AWS ELB 文档明确指出:

    后端连接(ALB 和目标之间)仅支持 HTTP 1.1 后端连接不支持 HTTP 1.1 管道(可能在某种程度上复制了 HTTP 2 多路复用)。

因此,您观察到的基本上是前端连接上的多路复用请求,这些请求由 ALB 逐一处理并等待后端回复,直到下一个前端请求被处理并路由到目标。

您可以参考documentation 中的“HTTP 连接”部分。

【讨论】:

以上是关于AWS 应用程序负载均衡器是不是仍然遭受客户端的 HOL 阻塞?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 AutoScale 实例使用 AWS 负载均衡器代理协议?

为 AWS EB 应用程序的网络负载均衡器 (NLB) 使用静态 IP?

AWS ELB 负载均衡器:是不是可以设置多个会话 cookie?

将 http 重定向到 https AWS 应用程序负载均衡器

AWS EC2应用程序负载均衡器+双向SSL?

我是不是需要 AWS ECS 中带有 nginx 的 AWS 负载均衡器?