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的真正性能到底如何相关推荐

  1. java中的native方法性能到底怎么样?

    前言 java中的native方法性能到底怎么样? 第一次写博客,如果写的不好,望见谅,烦请指出问题,虚心学习 先说结论,native 方法性能不如java方法 一.native方法? 主要是java ...

  2. amd r7 2700u linux,AMD锐龙7 2700U四核八线程性能到底有多强悍?实测揭晓

    原标题:AMD锐龙7 2700U四核八线程性能到底有多强悍?实测揭晓 科技犬消息,AMD在去年10月份发布了锐龙7 2500U和锐龙7 2700U两款移动处理器. 联想IdeaPad720S上手体验: ...

  3. 麒麟980能运行Linux吗,小迪来告诉你,麒麟980性能到底有多强

    原标题:小迪来告诉你,麒麟980性能到底有多强 就在8月31日,华为在IFA 2018德国柏林国际电子消费展会中正式发布了新一代旗舰级移动SoC--麒麟980. 华为深耕芯片市场多年,在研发上的投入是 ...

  4. 相比 Groovy 脚本,KTS 性能到底怎么样?

    /   今日科技快讯   / 近日,有报道称苹果公司在一封致荷兰消费者监管机构的信中称,其已经遵守命令,让旗下苹果应用商店向荷兰约会应用开放第三方支付系统.自1月15日以来,荷兰消费者和市场管理局几乎 ...

  5. Android安卓进阶之——相比 Groovy 脚本, KTS 性能到底怎么样?

    前言 大家肯定也都或多或少的写过一些Groovy代码,但由于不支持代码提示及编译时检查,使用Groovy开发的体验并不太好,Android Gradle插件4.0之后支持在Gradle构建配置中使用K ...

  6. linux sli 提高效率,性能到底提升几倍?多卡SLI的效率测试

    "三千预算进贴吧,四路泰坦抱回家" 这是贴吧上经常用于调侃"加钱党"的俗语.随着现在游戏质量和屏幕分辨率的提高,出现了越来越多的画面精美甚至可以以假乱真的游戏, ...

  7. CPU 硬盘性能到底相差多少

    本文以一个现代的.实际的个人电脑为对象,分析其中CPU(Intel Core 2 Duo 3.0GHz)以及各类子系统的运行速度--延迟和数据吞吐量.通过粗略的估算PC各个组件的相对运行速度,希望能给 ...

  8. Java 8 Stream的性能到底如何?

    Java 8提供的流的基于Lambda表达式的函数式的操作写法让人感觉很爽,笔者也一直用的很开心,直到看到了Java8 Lambda表达式和流操作如何让你的代码变慢5倍,笔者当时是震惊的,我读书少,你 ...

  9. 鲲鹏服务器和英特尔服务器性能,华为服务器用的鲲鹏CPU与英特尔至强CPU,性能到底有多大差距?...

    前不久,中国移动2020年PC服务器招标结果公布,华为以32%的份额位居第二,而作为世界最大PC服务器厂商的联想出局,在网友一片叫好声中,也有不少人问道:华为基于ARM的鲲鹏在性能上与英特尔的至强有多 ...

  10. 8750H带的动MATLAB2019吗,i7-8750H评测 性能到底怎么样

    描述 近日,Intel正式发布了八代酷睿的高性能移动版(Coffee Lake-H),首次为笔记本开启了六核心普及的大门.虽然此前AMD Ryzen将八核心带入了笔记本,但体量和影响都微乎其微,而这次 ...

最新文章

  1. DeeCamp 2020 赛题大公开!快来看你想选哪个
  2. fatal error: hdf5.h: No such file or directory
  3. python启动jupyter,在Jupyter上启动python脚本作为后台作业
  4. Halcon自定义函数封装方法(全网最详细)
  5. Class Diagram
  6. android 硬件对接,Android 对接硬件串口篇
  7. LeetCode 35. Search Insert Position
  8. 新职业英语计算机unit5,新职业英语2Unit5.ppt
  9. VMware Sphere 虚拟磁盘创建选项
  10. Maven学习总结(六)——Maven与Eclipse整合
  11. TwinCAT 软件安装级别的简要介绍,倍福FTP
  12. Android项目无用文件 BAT批处理 清理
  13. 免费视频文件生成视频二维码的方式详解
  14. exchange server 2007 边缘传输服务器 垃圾邮件,边缘传输 启用反垃圾邮件更新向导 启用反垃圾邮件更新页...
  15. 搞一下整车以太网技术 | 01 汽车以太网PHY详解
  16. 使用System.setOut()
  17. Bmob后端云的集成与使用
  18. 技.艺.道:器-python一站式平台Jupyter(丘比特)入门
  19. 山东海王星·关于国内文旅水上乐园的运营营销构思
  20. macbook linux 双系统,MacOS+Ubuntu双系统,原来MacBook安装linux也简单!

热门文章

  1. 调试工具BTrace 的使用--例子
  2. composer 无法更新vonder
  3. Android代码如何监控apk安装 卸载 替换
  4. Excel的Range对象(C#)
  5. 原创 leetcode[349]两个数组的交集/ Intersection of Two Arrays 哈希策略
  6. 苹果mac 3D游戏动画开发软件:Unity Pro
  7. 苹果Mac 2D/3D数字雕刻软件:Pixologic Zbrush
  8. iOS开发之UITableView自定义Header视图和自定义Footer视图
  9. MacDroid for mac(安卓手机数据传输助手)
  10. linux学习之使用fdisk命令进行磁盘分区(八)