深入研究:HTTP2的真正性能到底如何
01-
研究目的
HTTP2的概念提出已经有相当长一段时间了,而网上关于关于HTTP2的文章也一搜一大把。但是从搜索的结果来看,现有的文章多是偏向于对HTTP2的介绍,鲜有真正从数据上具体分析的。这篇文章正是出于填补这块空缺内容的目的,通过一系列的实验以及数据分析,对HTTP2的性能进行深入研究。当然,由于本人技术有限,实验所使用的方法肯定会有不足之处,如果各位看官有发现问题,还请向我提出,我一定会努力修改完善实验的方法的!
02-
基础知识
关于HTTP2的基础知识,可以参考下列几篇文章,在这里就不进行赘述了。
HTTP, HTTP2.0, SPDY, HTTPS | 4种网络协议的渊源与发展
一分钟预览 HTTP2 特性和抓包分析
HTTP 2.0 的那些事(http://mrpeak.cn/blog/http2/)
7 Tips for Faster HTTP/2 Performance
(https://www.nginx.com/blog/7-tips-for-faster-http2-performance/)
通过学习相关资料,我们已经对HTTP2有了一个大致的认识,接下来将通过设计一个模型,对HTTP2的性能进行实验测试。
03-
实验设计
设置实验组:搭建一个HTTP2(SPDY)服务器,能够以HTTP2的方式响应请求。同时,响应的内容大小,响应的延迟时间均可自定义。
设置对照组:搭建一个HTTP1.x服务器,以HTTP1.x的方式响应请求,其可自定义内容同实验组。另外为了减少误差,HTTP1.x服务器使用https协议。
测试过程:客户端通过设置响应的内容大小、请求资源的数量、延迟时间、上下行带宽等参数,分别对实验组服务器和对照组服务器发起请求,统计响应完成所需时间。
由于nginx切换成HTTP2需要升级nginx版本以及取得https证书,且在服务器端的多种自定义设置所涉及的操作环节相对复杂,综合考虑之下放弃使用nginx作为实验用服务器的方案,而是采用了NodeJS方案。在实验的初始阶段,使用了原生的NodeJS搭配node-http2模块进行服务器搭建,后来改为了使用express框架搭配node-spdy模块搭建。原因是,原生NodeJS对于复杂请求的处理非常复杂,express框架对请求、响应等已经做了一系列的优化,可以有效减少人为的误差。另外node-http2模块无法与express框架兼容,同时它的性能较之node-spdy模块也更低(General performance, node-spdy vs node-http2 #98),而node-spdy模块的功能与node-http2模块基本一致。
1、服务器搭建
实验组和对照组的服务器逻辑完全一致,关键代码如下:
其逻辑是,根据从客户端传入的参数,动态设置响应资源的大小和延迟时间。
2、客户端搭建
客户端可动态设置请求的次数、资源的数目、资源的大小和服务器延迟时间。同时搭配Chrome的开发者工具,可以人为模拟不同网络环境。在资源请求响应结束后,会自动计算总耗时时间。关键代码如下:
客户端通过循环对资源进行多次请求,其数量可设置。每一次循环都会通过imageLoadTime更新时间,以实现时间统计的功能。
3、实验项目
a. HTTP2性能研究
通过研究章节二的文章内容,可以把http2的性能影响因素归结于“延迟”和“请求数目”。本实验增加了“资源体积”和“网络环境”作为影响因素,下面将会针对这四项进行详细的测试实验。其中每一次实验都会重复10次,取平均值后作记录。
b. 服务端推送研究
http2还有一项非常特别的功能——服务端推送。服务端推送允许服务器主动向客户端推送资源。本实验也会针对这个功能展开研究,主要研究服务端推送的使用方法及其对性能的影响。
04-
HTTP2性能数据统计
1、延迟因素对性能的影响
条件/实验次数 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
延迟时间(ms) | 0 | 10 | 20 | 30 | 40 |
资源数目(个) | 100 | 100 | 100 | 100 | 100 |
资源大小(MB) | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 |
统计时间(s)http1.x | 0.38 | 0.51 | 0.62 | 0.78 | 0.94 |
统计时间(s)http2 | 0.48 | 0.51 | 0.49 | 0.48 | 0.50 |
2、请求数目对性能的影响
通过上一个实验,可以知道在延迟为10ms的时候,http1.x和http2的时间统计相近,故本次实验延迟时间设置为10ms。
条件/实验次数 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
延迟时间(ms) | 10 | 10 | 10 | 10 | 10 |
资源数目(个) | 6 | 30 | 150 | 750 | 3750 |
资源大小(MB) | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 |
统计时间(s)http1.x | 0.04 | 0.16 | 0.63 | 3.03 | 20.72 |
统计时间(s)http2 | 0.04 | 0.16 | 0.71 | 3.28 |
19.34 |
增加延迟时间,重复实验:
条件/实验次数 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|
延迟时间(ms) | 30 | 30 | 30 | 30 | 30 |
资源数目(个) | 6 | 30 | 150 | 750 | 3750 |
资源大小(MB) | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 |
统计时间(s)http1.x | 0.07 | 0.24 | 1.32 | 5.63 | 28.82 |
统计时间(s)http2 | 0.07 | 0.17 | 0.78 | 3.81 | 18.78 |
3、资源体积对性能的影响
通过上两个实验,可以知道在延迟为10ms,资源数目为30个的时候,http1.x和http2的时间统计相近,故本次实验延迟时间设置为10ms,资源数目30个。
条件/实验次数 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
延迟时间(ms) | 10 | 10 | 10 | 10 | 10 |
资源数目(个) | 30 | 30 | 30 | 30 | 30 |
资源大小(MB) | 0.2 | 0.4 | 0.6 | 0.8 | 1.0 |
统计时间(s)http1.x | 0.21 | 0.37 | 0.59 | 0.68 | 0.68 |
统计时间(s)http2 | 0.25 | 0.45 | 0.61 | 0.83 | 0.73 |
条件/实验次数 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|
延迟时间(ms) | 10 | 10 | 10 | 10 | 10 |
资源数目(个) | 30 | 30 | 30 | 30 | 30 |
资源大小(MB) | 1.2 | 1.4 | 1.6 | 1.8 | 2.0 |
统计时间(s)http1.x | 0.78 | 0.94 | 1.02 | 1.07 | 1.13 |
统计时间(s)http2 | 0.92 | 0.86 | 1.08 | 1.26 | 1.33 |
4、网络环境对性能的影响
通过上两个实验,可以知道在延迟为10ms,资源数目为30个的时候,http1.x和http2的时间统计相近,故本次实验延迟时间设置为10ms,资源数目30个。
条件/网络条件 | Regular 2G | Good 2G | Regular 3G | Good 3G | Regular 4G | Wifi |
---|---|---|---|---|---|---|
延迟时间(ms) | 10 | 10 | 10 | 10 | 10 | 10 |
资源数目(个) | 30 | 30 | 30 | 30 | 30 | 30 |
资源大小(MB) | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 |
统计时间(s)http1.x | 222.66 | 116.64 | 67.37 | 32.82 | 11.89 | 0.87 |
统计时间(s)http2 | 138.06 | 71.02 | 40.77 | 20.82 | 7.70 | 0.94 |
05-
http2服务端推送实验
本实验主要针对网络环境对服务端推送速度的影响进行研究。在本实验中,所请求/推送的资源都是一个体积为290Kb的JS文件。每一个网络环境下都会重复十次实验,取平均值后填入表格。
条件/网络条件 | Regular 2G | Good 2G | Regular 3G | Good 3G | Regular 4G | Wifi |
---|---|---|---|---|---|---|
客户端请求总耗时(s) | 9.59 | 5.30 | 3.21 | 1.57 | 0.63 | 0.12 |
服务端推送总耗时(s) | 18.83 | 10.46 | 6.31 | 3.09 | 1.19 | 0.20 |
资源加载速度-客户端请求(s) | 9.24 | 5.13 | 3.08 | 1.50 | 0.56 | 0.08 |
资源加载速度-服务端推送(s) | 9.28 | 5.16 | 3.09 | 1.51 | 0.57 | 0.08 |
条件/网络条件 | No Throttling |
---|---|
客户端请求总耗时(ms) | 56 |
服务端推送总耗时(ms) | 18 |
资源加载速度-客户端请求(s) | 15.03 |
资源加载速度-服务端推送(s) | 2.80 |
从上述表格可以发现一个非常奇怪的现象,在开启了网络节流以后(包括Wifi选项),服务端推送的速度都远远比不上普通的客户端请求,但是在关闭了网络节流后,服务端推送的速度优势非常明显。在网络节流的Wifi选项中,下载速度为30M/s,上传速度为15M/s。而测试所用网络的实际下载速度却只有542K/s,上传速度只有142K/s,远远达不到网络节流Wifi选项的速度。为了分析这个原因,我们需要理解“服务端推送”的原理,以及推送过来的资源的存放位置在哪里。
普通的客户端请求过程如下图:
服务端推送的过程如下图:
从上述原理图可以知道,服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。但是这里又有一个问题,这些被推送的资源又是存放在哪里呢?参考了这篇文章Issue 5: HTTP/2 Push以后,终于找到了原因。我们可以把服务端推送过程的原理图深入一下:
服务端推送过来的资源,会统一放在一个网络与http缓存之间的一个地方,在这里可以理解为“本地”。当客户端把index.html解析完以后,会向本地请求这个资源。由于资源已经本地化,所以这个请求的速度非常快,这也是服务端推送性能优势的体现之一。当然,这个已经本地化的资源会返回200状态码,而非类似localStorage的304或者200 (from cache)状态码。Chrome的网络节流工具,会在任何“网络请求”之间加入节流,由于服务端推送活来的静态资源也是返回200状态码,所以Chrome会把它当作网络请求来处理,于是导致了上述实验所看到的问题。
06-
研究结论
通过上述一系列的实验,我们可以知道http2的性能优势集中体现在“多路复用”和“服务端推送”上。对于请求数目较少(约小于30个)的情况下,http1.x和http2的性能差异不大,在请求数目较多且延迟大于30ms的情况下,才能体现http2的性能优势。对于网络状况较差的环境,http2的性能也高于http1.x。与此同时,如果把静态资源都通过服务端推送的方式来处理,加载速度会得到更加巨大的提升。
在实际的应用中,由于http2多路复用的优势,前端应用团队无须采取把多个文件合并成一个,生成雪碧图之类的方法减少网络请求。除此之外,http2对于前端开发的影响并不大。
服务端升级http2,如果是使用NodeJS方案,只需要把node-http模块升级为node-spdy模块,并加入证书即可。nginx方案的话可以参考这篇文章:Open Source NGINX 1.9.5 Released with HTTP/2 Support
若要使用服务端推送,则在服务端需要对响应的逻辑进行扩展,这个需要视情况具体分析实施。
07-
后记
纸上得来终觉浅,绝知此事要躬行。如果不是真正的设计实验、进行实验,我可能根本不会知道原来http2也有坑,原来使用Chrome做调试的时候也有需要注意的地方。
希望这篇文章能够对研究http2的同学有些许帮助吧,如文章开头所说,如果你发现我的实验设计有任何问题,或者你想到了更好的实验方式,也欢迎向我提出,我一定会认真研读你的建议的!
下面附送实验所需源码:
1、客户端页面
2、服务端代码(http1.x与http2仅有一处不同)
✦ ✦ ✦ ✦ ✦ ✦ ✦ ✦
作者:jrainlau
原文:https://segmentfault.com/a/1190000007219256
-END-
欢迎关注“互联网架构师”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们只聊互联网、只聊架构,不聊其他!打造最有价值的架构师圈子和社区。
本公众号覆盖中国主要首席架构师、高级架构师、CTO、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。
长按下方的二维码可以快速关注我们
如想加群讨论学习,请点击右下角的“加群学习”菜单入群。
深入研究:HTTP2的真正性能到底如何相关推荐
- java中的native方法性能到底怎么样?
前言 java中的native方法性能到底怎么样? 第一次写博客,如果写的不好,望见谅,烦请指出问题,虚心学习 先说结论,native 方法性能不如java方法 一.native方法? 主要是java ...
- amd r7 2700u linux,AMD锐龙7 2700U四核八线程性能到底有多强悍?实测揭晓
原标题:AMD锐龙7 2700U四核八线程性能到底有多强悍?实测揭晓 科技犬消息,AMD在去年10月份发布了锐龙7 2500U和锐龙7 2700U两款移动处理器. 联想IdeaPad720S上手体验: ...
- 麒麟980能运行Linux吗,小迪来告诉你,麒麟980性能到底有多强
原标题:小迪来告诉你,麒麟980性能到底有多强 就在8月31日,华为在IFA 2018德国柏林国际电子消费展会中正式发布了新一代旗舰级移动SoC--麒麟980. 华为深耕芯片市场多年,在研发上的投入是 ...
- 相比 Groovy 脚本,KTS 性能到底怎么样?
/ 今日科技快讯 / 近日,有报道称苹果公司在一封致荷兰消费者监管机构的信中称,其已经遵守命令,让旗下苹果应用商店向荷兰约会应用开放第三方支付系统.自1月15日以来,荷兰消费者和市场管理局几乎 ...
- Android安卓进阶之——相比 Groovy 脚本, KTS 性能到底怎么样?
前言 大家肯定也都或多或少的写过一些Groovy代码,但由于不支持代码提示及编译时检查,使用Groovy开发的体验并不太好,Android Gradle插件4.0之后支持在Gradle构建配置中使用K ...
- linux sli 提高效率,性能到底提升几倍?多卡SLI的效率测试
"三千预算进贴吧,四路泰坦抱回家" 这是贴吧上经常用于调侃"加钱党"的俗语.随着现在游戏质量和屏幕分辨率的提高,出现了越来越多的画面精美甚至可以以假乱真的游戏, ...
- CPU 硬盘性能到底相差多少
本文以一个现代的.实际的个人电脑为对象,分析其中CPU(Intel Core 2 Duo 3.0GHz)以及各类子系统的运行速度--延迟和数据吞吐量.通过粗略的估算PC各个组件的相对运行速度,希望能给 ...
- Java 8 Stream的性能到底如何?
Java 8提供的流的基于Lambda表达式的函数式的操作写法让人感觉很爽,笔者也一直用的很开心,直到看到了Java8 Lambda表达式和流操作如何让你的代码变慢5倍,笔者当时是震惊的,我读书少,你 ...
- 鲲鹏服务器和英特尔服务器性能,华为服务器用的鲲鹏CPU与英特尔至强CPU,性能到底有多大差距?...
前不久,中国移动2020年PC服务器招标结果公布,华为以32%的份额位居第二,而作为世界最大PC服务器厂商的联想出局,在网友一片叫好声中,也有不少人问道:华为基于ARM的鲲鹏在性能上与英特尔的至强有多 ...
- 8750H带的动MATLAB2019吗,i7-8750H评测 性能到底怎么样
描述 近日,Intel正式发布了八代酷睿的高性能移动版(Coffee Lake-H),首次为笔记本开启了六核心普及的大门.虽然此前AMD Ryzen将八核心带入了笔记本,但体量和影响都微乎其微,而这次 ...
最新文章
- DeeCamp 2020 赛题大公开!快来看你想选哪个
- fatal error: hdf5.h: No such file or directory
- python启动jupyter,在Jupyter上启动python脚本作为后台作业
- Halcon自定义函数封装方法(全网最详细)
- Class Diagram
- android 硬件对接,Android 对接硬件串口篇
- LeetCode 35. Search Insert Position
- 新职业英语计算机unit5,新职业英语2Unit5.ppt
- VMware Sphere 虚拟磁盘创建选项
- Maven学习总结(六)——Maven与Eclipse整合
- TwinCAT 软件安装级别的简要介绍,倍福FTP
- Android项目无用文件 BAT批处理 清理
- 免费视频文件生成视频二维码的方式详解
- exchange server 2007 边缘传输服务器 垃圾邮件,边缘传输 启用反垃圾邮件更新向导 启用反垃圾邮件更新页...
- 搞一下整车以太网技术 | 01 汽车以太网PHY详解
- 使用System.setOut()
- Bmob后端云的集成与使用
- 技.艺.道:器-python一站式平台Jupyter(丘比特)入门
- 山东海王星·关于国内文旅水上乐园的运营营销构思
- macbook linux 双系统,MacOS+Ubuntu双系统,原来MacBook安装linux也简单!
热门文章
- 调试工具BTrace 的使用--例子
- composer 无法更新vonder
- Android代码如何监控apk安装 卸载 替换
- Excel的Range对象(C#)
- 原创 leetcode[349]两个数组的交集/ Intersection of Two Arrays 哈希策略
- 苹果mac 3D游戏动画开发软件:Unity Pro
- 苹果Mac 2D/3D数字雕刻软件:Pixologic Zbrush
- iOS开发之UITableView自定义Header视图和自定义Footer视图
- MacDroid for mac(安卓手机数据传输助手)
- linux学习之使用fdisk命令进行磁盘分区(八)