为什么 HTTP/2 比普通 HTTPS 慢?
Why HTTP/2 is slower than plain HTTPS?
我正在评估我的网站从 HTTP2 获得的性能和奇怪的结果 - 欧洲的网站是从美国加载的:
- 与 HTTP/2 - 在 6-7 秒内
- 使用纯 HTTPS - 在 5-6 秒内(大约快 1 秒)
我从 Chrome 的网络监视器中截取了屏幕截图,看起来 HTTP/2 大多数资源都是一个接一个地加载,而不是像普通 SSL 那样并行加载。
为了测试,我使用 Apache 2.4.17 (Win32) 涵盖的 Web 应用程序作为代理(应用对 SSL 和 HTTP/2 协议的支持)。客户端浏览器是 Chrome 46.0.2490.86 on Windows 7.
捕获到的网络请求如下。简短的摘要:
1. 第一个-是HTML页
2. 下一组 - 6 个请求 - 直接在 HTML 中声明的资源
3. 其余 - 通过脚本动态添加的资源(document/head 中的 'script' 和 'link/css' 标签)。
图片左边是HTTP/2,
右侧 - 同一员工通过纯 SSL(http2_module 已关闭)。
更新:我测试了"something else"什么支持HTTP/2作为反向代理。这是来自 http://nginx-win.ecsds.eu - fork of original nginx 'for windows'. HTTP/2 in original nginx is only available in commercial version, therefore I could not try it. And it looks like there are no other servers implementation of HTTP/2 + reverse proxy available for windows, or I just couldn't find them (list here and here).
的 nginx 1.9.7.1 Kitty
我在 Kitty 上得到的结果更具误导性 - 没有像 Apache 中那样的 'sequential load' 资源,但 HTTP/2 上的传输速率比普通 SSL 慢两倍。最终结果是 - HTTP/2 比普通 SSL 慢得多。下面是所有的并排。
综上所述,我只能假设性能在很大程度上取决于实现,而当前可用的实现表现得很奇怪,无法得出关于 HTTP/2 的任何一致结论。
所以,最后我的决定是 - HTTP/2 本身没有问题,当前可用的实现有问题。
- Apache HTTPD 2.4.17 / Win32 - 有一些奇怪的'sequential load'效果
- nginx Kitty - 提供异常缓慢的传输速率
- 官方免费软件 nginx 没有内置 http2 模块
但是
- 从 kevinworthington.com
为 windows 定制的 nginx
- Apache HTTPD 2.4.17 / linux
两者都显示了预期的性能。这是在 'the question' 中执行的相同测试的屏幕截图,但 Apache 反向代理托管在此处另一个人的 linux 计算机上。
看看这个,它是从 Taobao.org 开发的 nginx 的修改版本,并被全球速卖通和许多其他繁忙的网站使用。它开箱即用地支持 HTTP2,以及一些仅在商业 nginx 中可用的其他功能,如上游控制。
我们是 运行 最新的 nginx http/2
nginx version: nginx/1.9.10
built with OpenSSL 1.0.2e 3 Dec 2015
TLS SNI support enabled
我们也有同样的观察。我们正在记录 $request_time 和 $upstream_time。尽管 upstream_time 与协议无关,但总体 request_time 不同:
# grep ' 443 ' access.log|grep 'HTTP/1.1'| cut -d ' ' -f 3,4 | awk '{r+=; u+=} END {print r/NR; print u/NR}'
0.0116887 # HTTP/1.1 request_time in seconds
0.00673473 # HTTP/1.1 upstream_time in seconds
# grep ' 443 ' access.log|grep 'HTTP/2.0'| cut -d ' ' -f 3,4 | awk '{r+=; u+=} END {print r/NR; print u/NR}'
0.0363673 # HTTP/2.0 request_time in seconds
0.00695812 # HTTP/2.0 upstream_time in seconds
因此 http/1.1 的整体请求时间缩短了三倍!由于流的原因,可能有些东西不适用于 request_time 日志记录和 http/2。我真的不知道,但承诺是 http/2 比 http/1.1 快,如果两者都是 运行 在 TLS 上。
但我会进一步调查此事。
HTTP2 更高效,意味着从多连接变为单连接。它也更具响应性,因此优先级更高的请求流将首先响应。
通常情况下,单个连接可用的带宽量是有限制的,因此早期的 HTTP 协议虽然通过建立更多连接、使用大部分网络堆栈来发挥不公平,但如果多个连接可以说已经建立,那么 HTTP1.1 将在获取多个资源方面战胜 HTTP/2。
这一切都深入到每个 tcp 连接的带宽。此外,单一 TCP 连接普遍存在标题阻塞问题,该问题已在 HTTP3 中得到解决,因此目前这是 HTTP2 的另一个缺点
同时请注意,HTTP2 不限制您建立多个连接,目前也没有限制浏览器只能与服务器建立一个 TCP 连接,因此 HTTP2 可以通过超越它的限制来优化原始定义。
我正在评估我的网站从 HTTP2 获得的性能和奇怪的结果 - 欧洲的网站是从美国加载的:
- 与 HTTP/2 - 在 6-7 秒内
- 使用纯 HTTPS - 在 5-6 秒内(大约快 1 秒)
我从 Chrome 的网络监视器中截取了屏幕截图,看起来 HTTP/2 大多数资源都是一个接一个地加载,而不是像普通 SSL 那样并行加载。
为了测试,我使用 Apache 2.4.17 (Win32) 涵盖的 Web 应用程序作为代理(应用对 SSL 和 HTTP/2 协议的支持)。客户端浏览器是 Chrome 46.0.2490.86 on Windows 7.
捕获到的网络请求如下。简短的摘要: 1. 第一个-是HTML页 2. 下一组 - 6 个请求 - 直接在 HTML 中声明的资源 3. 其余 - 通过脚本动态添加的资源(document/head 中的 'script' 和 'link/css' 标签)。
图片左边是HTTP/2, 右侧 - 同一员工通过纯 SSL(http2_module 已关闭)。
更新:我测试了"something else"什么支持HTTP/2作为反向代理。这是来自 http://nginx-win.ecsds.eu - fork of original nginx 'for windows'. HTTP/2 in original nginx is only available in commercial version, therefore I could not try it. And it looks like there are no other servers implementation of HTTP/2 + reverse proxy available for windows, or I just couldn't find them (list here and here).
的 nginx 1.9.7.1 Kitty我在 Kitty 上得到的结果更具误导性 - 没有像 Apache 中那样的 'sequential load' 资源,但 HTTP/2 上的传输速率比普通 SSL 慢两倍。最终结果是 - HTTP/2 比普通 SSL 慢得多。下面是所有的并排。
综上所述,我只能假设性能在很大程度上取决于实现,而当前可用的实现表现得很奇怪,无法得出关于 HTTP/2 的任何一致结论。
所以,最后我的决定是 - HTTP/2 本身没有问题,当前可用的实现有问题。
- Apache HTTPD 2.4.17 / Win32 - 有一些奇怪的'sequential load'效果
- nginx Kitty - 提供异常缓慢的传输速率
- 官方免费软件 nginx 没有内置 http2 模块
但是
- 从 kevinworthington.com 为 windows 定制的 nginx
- Apache HTTPD 2.4.17 / linux
两者都显示了预期的性能。这是在 'the question' 中执行的相同测试的屏幕截图,但 Apache 反向代理托管在此处另一个人的 linux 计算机上。
看看这个,它是从 Taobao.org 开发的 nginx 的修改版本,并被全球速卖通和许多其他繁忙的网站使用。它开箱即用地支持 HTTP2,以及一些仅在商业 nginx 中可用的其他功能,如上游控制。
我们是 运行 最新的 nginx http/2
nginx version: nginx/1.9.10
built with OpenSSL 1.0.2e 3 Dec 2015
TLS SNI support enabled
我们也有同样的观察。我们正在记录 $request_time 和 $upstream_time。尽管 upstream_time 与协议无关,但总体 request_time 不同:
# grep ' 443 ' access.log|grep 'HTTP/1.1'| cut -d ' ' -f 3,4 | awk '{r+=; u+=} END {print r/NR; print u/NR}'
0.0116887 # HTTP/1.1 request_time in seconds
0.00673473 # HTTP/1.1 upstream_time in seconds
# grep ' 443 ' access.log|grep 'HTTP/2.0'| cut -d ' ' -f 3,4 | awk '{r+=; u+=} END {print r/NR; print u/NR}'
0.0363673 # HTTP/2.0 request_time in seconds
0.00695812 # HTTP/2.0 upstream_time in seconds
因此 http/1.1 的整体请求时间缩短了三倍!由于流的原因,可能有些东西不适用于 request_time 日志记录和 http/2。我真的不知道,但承诺是 http/2 比 http/1.1 快,如果两者都是 运行 在 TLS 上。
但我会进一步调查此事。
HTTP2 更高效,意味着从多连接变为单连接。它也更具响应性,因此优先级更高的请求流将首先响应。
通常情况下,单个连接可用的带宽量是有限制的,因此早期的 HTTP 协议虽然通过建立更多连接、使用大部分网络堆栈来发挥不公平,但如果多个连接可以说已经建立,那么 HTTP1.1 将在获取多个资源方面战胜 HTTP/2。
这一切都深入到每个 tcp 连接的带宽。此外,单一 TCP 连接普遍存在标题阻塞问题,该问题已在 HTTP3 中得到解决,因此目前这是 HTTP2 的另一个缺点
同时请注意,HTTP2 不限制您建立多个连接,目前也没有限制浏览器只能与服务器建立一个 TCP 连接,因此 HTTP2 可以通过超越它的限制来优化原始定义。