为啥我的 HTTP/2 流比 HTTP/1.1 和 HTTPS 慢

Posted

技术标签:

【中文标题】为啥我的 HTTP/2 流比 HTTP/1.1 和 HTTPS 慢【英文标题】:Why is my HTTP/2 stream slower than HTTP/1.1 and HTTPS为什么我的 HTTP/2 流比 HTTP/1.1 和 HTTPS 慢 【发布时间】:2017-07-14 06:44:04 【问题描述】:

在我的研究中,我正在分析 HTTP/2 与 HTTP/1.1 和 HTTPS 的性能对比。

在我的测试中,我加载了一组 128 张图像,以查看 HTTP/2 是否因其多路复用流而受益。在每次测试中,图像的大小分别为 2KB、20KB 和 50KB。

I got the following results for Page Load Time

最初,我会假设 HTTP/2 会比 HTTP/1.1 更快,或者最大速度与 HTTP/1.1 一样快。但是为什么 HTTP/2 在 20KB 和 50KB 的测试运行中要慢 20% 以上。有谁知道原因可能是什么?

我在服务器端使用 nginx 1.10.0。 在客户端 chrome 上。延迟:50 毫秒。丢包率低。

【问题讨论】:

只有结果,没有关于您正在衡量的案例的更多细节,没有多少人可以提供建议。也许您可以详细说明正在加载的确切内容,例如资产数量、http 请求的详细描述以及资产类型。或者,更好的是,您的测试代码的可重现示例。 【参考方案1】:

在我看来,

当满足这些条件(但不限于)时,由其机制决定的 HTTP/2 显示出比 HTTP/1.1 的速度优势:

    许多并行请求 小型请求/响应负载 高 RTT 值

如果上述大多数条件都没有满足(例如下载单个大文件),那么 HTTP/2 的性能可能比 HTTP/1.1 差。

【讨论】:

【参考方案2】:

我刚刚使用 Jetty 进行了测试(免责声明,我是 HTTP/2 Jetty 维护者)。

Jetty 9.4.2,JDK 8u121,模拟网络往返 50 毫秒(通过 tc)。

20 张图片,每张 2k:

HTTP/1.1:    ~275 ms
HTTP/2:      ~170 ms
HTTP/2 Push: ~155 ms

20 张图片,每张 20k:

HTTP/1.1:    ~380 ms
HTTP/2:      ~200 ms
HTTP/2 Push: ~155 ms

20 张图片,每张 50k:

HTTP/1.1:    ~380 ms
HTTP/2:      ~220 ms
HTTP/2 Push: ~155 ms

除了这个快速测试之外,我们的经验是 HTTP/2 多路复用确实有效地减少了最终用户的延迟。 HTTP/2 和 HTTP/2 Push 更好。 您可以在网上找到大量 HTTP/2 演示也证实了这一点。

上面的快速测试代码可以在here找到。

我怀疑这可能是一些 nginx 问题,可能与流量控制有关(因为您只在较大的图像尺寸时遇到问题)。

【讨论】:

感谢您的回答!我怀疑同样的事情,流量控制是问题所在。有什么想法可以用 nginx 解决这个问题吗? 向 nginx 项目报告问题。

以上是关于为啥我的 HTTP/2 流比 HTTP/1.1 和 HTTPS 慢的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 HTTP/2 的应用只建立一个 TCP 连接?

HTTP/1.1 和 HTTP/2 混合请求

http/2.0与http/1.1的区别

HTTP2你还不知道吗?

PHP:获取 HTTP 协议版本(HTTP/1.1 与 HTTP/2)

HTTP/2和HTTP/1.1的比较