`
greemranqq
  • 浏览: 980012 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

[转]李平:大型网站的灵魂——性能

阅读更多

这篇文章,可以对才入换联网,还没形成整体概念的人,提供一些基础入门,特别从请求开始到结束部分,了解了解 还是不错的。

原文地址:http://www.csdn.net/article/2014-09-30/2821940

 

什么是性能

有人说性能就是访问速度快慢,这是最直观的说法,也是用户的真实体验。一个用户从输入网址到按下回车键,看到网页的快慢,这就是性能。对于我们来说,需要去挖掘这个过程,因为这决定我们怎么去做性能优化。

这中间发生了什么?

用户访问网站的整个流程:用户输入网站域名,通过DNS解析,找到目标服务器IP,请求数据经互联网达到目标服务器,目标服务器收到请求数据,进行处理(执行程序、访问数据库、文件服务器等)。处理完成,将响应数据又经互联网返回给用户浏览器,浏览器得到结果进行计算渲染显示给用户。

我们把整个过程,分为三段路径:

 

  • 第一段在用户和浏览器端,主要负责发出用户请求,以及接受响应数据进行计算渲染显示给用户;
  • 第二段在网络上,负责对请求数据、响应数据的传输;
  • 第三段在网站服务器端,负责对请求数据进行处理(执行程序、访问数据库、文件等),并将结果返回;

 

第一路径

第一路径花费的时间包括输入域名发起请求的时间和浏览器收到响应后计算渲染的时间。

输入域名发起请求,实质过程是:

 

  1. 用户在浏览器输入要访问的网站域名;
  2. 本地DNS请求网站授权的DNS服务器对域名进行解析,并得到解析结果即IP地址(并将IP地址缓存起来)。
  3. 向目标IP地址发出请求。

 

从这个过程我们可以看到,优化的地方主要是减少DNS解析次数,而如果用户浏览器设置了缓存,则再第二次访问相同域名的时候就不会去请求DNS服务器,直接用缓存中的IP地址发出请求。因此这个过程主要取决于浏览器的设置。现在主流的浏览器默认设置了DNS的预取功能(DNS Prefetch),当然你也可以主动告知浏览器我的网站需要做DNS预取:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <meta http-equiv="x-dns-prefetch-control" content="on" />  

 

浏览器将数据进行计算渲染的过程:

 

  1. 浏览器解析响应数据;
  2. 浏览器创建DOM树;
  3. 浏览器下载CSS样式,并应用到DOM树,进行渲染;
  4. 浏览器下载JS文件,开始解析执行;
  5. 显示给用户。

 

从这个过程,我们可以找出不少可以优化的地方。首先我们可以尽量控制页面大小,使得浏览器解析的时间更短;并且将多个CSS文件、JS文件文件合并压缩减少文件下载的次数和大小;另外注意将CSS放在页面前面,JS访问页面后面,这样便于页面首先能渲染出来,再执行js脚本,对于用户来说有更好的体验。最后我还可以设置浏览器缓存,下次访问时从缓存读取内容,减少http请求。

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <meta http-equiv="Cache-Control" content="max-age=5" />  

 

该代码说明了浏览器启用了缓存并在5秒内不会再次访问服务器。注意缓存的设置需要结合你的业务特性来适当配置。

以下是京东商城的HTML简图:

css样式放在html前面,并且进行了合并。

大多数的JS文件放在页尾。 

第二路径

第二路径在网络上,花费的时间同样包括请求数据的传输时间和响应数据的传输时间,这个两个时间取决于数据传输的速度,这里我们要讲一个名词“带宽”。什么是带宽,我们经常说带宽10M,20M是什么意思?我的带宽20M,这意味着什么?我们知道带宽速度分为上行、下行速度,也就是上传和下载的速度。带宽20M对于用户来说则是下载速度20M(20×1024×1024比特率),换算成字节20M/8=2.5M。也就是说20M的带宽下载速度理论可达2.5M/s,而对于家庭用户而言上传速度一般比下载速度小的多,大约是不到十分之一。而对于网站服务器(企业用户)来说,则不然,一般上行速度等于下载速度。这也是运营商根据实际需求分配的,毕竟用户的主要需求是下载数据,而不是上传数据。

整个流程从传输方式看就是:用户发送请求数据(上传),网站服务器接受请求数据(下载),网站服务器返回响应数据(上传),用户接受响应数据(下载)。对于用户来说,上传数据是很小的(Url参数),而下载数据是较大的(响应数据);对于服务器来说,下载数据是很小的(url参数),上传数据是较大(响应数据)。理解了这个,我们可以解释为什么有时用户反映为什么自己的带宽足够,但打开某些网站仍然很慢,就是因为尽管用户的下载速度很快,但网站服务器的上传速度很慢,这就像一个抽水管和一个出水管,不管抽水管再大,但出水管很小,同样抽到的水量是有限的。了解了这个原理我们来看怎么提高数据传输的速度,首先用户的上传、下载速度我们是无法决定的,我们能决定的是网站服务器的上传、下载速度,所以我们可以做的是适当的增加服务器带宽(带宽是很贵的,盲目的增加只会增加不必要成本)。购买合适的带宽需要根据网站业务特性、规模以及结合运维人员的经验来选择。通常可以考虑的算法,即根据一次响应数据的大小,乘以PV数,除以对应的高峰时间段,从而大致估算出网站带宽的需求。

下面我们继续进一步研究第二路径:

上图表示用户访问网站服务器时网络的大致情况,从图上可以看出假设网站服务器从电信网络接入,而用户A作为电信的宽带用户,则可以通过电信骨干网快速的访问到网站服务器。用户B,用户C作为移动和联通用户需要通过运营商的互联互通经过较长路径才能访问到服务器。

针对这种情况,我们可以采取以下方法来优化:

 

  1. 在各运营商发达的地区的IDC(互联网数据中心,可以理解成机房)部署网站服务器,各运营商的用户即可通过各自的骨干网访问服务器。
  2. 购买代理服务,也就是原来联通用户需要通过联通骨干网——>联通互联互通路由器——>电信骨干网——>网站服务器的过程。通过代理服务,代理服务器直连到电信骨干网,访问网站服务器。
  3. 在主要地区城市购买CDN服务,缓存对应的数据,用户可先从最近的CDN运营商获取请求数据。

 

第三路径

第三路径主要是网站服务器内部处理的过程,当中包括执行程序、访问文件、数据库等资源。

这是对于我们来说最可以发挥的地方:

 

  • 使用缓存,根据需要使用本地缓存或分布式缓存;
  • 使用异步操作,这种方式不仅可以提高性能,也提高了系统的扩展性;
  • 代码优化;
  • 存储优化;

 

缓存

如果缓存数据较少,可以利用OSCache实现本地缓存:

 

当缓存数据过多时,利用Memcached实现分布式缓存: 

Memcached实现分布式缓存,缓存服务器之间是互不通信的,也就是我们可以方便的通过增加Memcached服务器对系统进行扩展。 

异步操作 

使用同步请求的方式,在高并发的情况下,会对数据库造成很大的压力,也会让用户感觉响应时间过长。异步请求方式,则可以快速的对用户做出响应,而具体的数据库操作请求,则通过消息队列服务器发送给数据库服务器,做具体的插入操作。插入操作的结果则已其他方式通知客户端。例如一般在订票系统当中,出票行为就是异步完成,最终的出票结果会以邮件或其他方式告知用户。

代码优化

这里就不在详细描述,另一篇随笔《怎样编写高质量的java代码》对代码质量和风格做过大致的介绍,有兴趣可以看一下。

存储优化

大型网站中海量的数据读写对磁盘造成很大压力,系统最大的瓶颈还是在磁盘的读写。可以考虑使用磁盘阵列、分布式储存来改善存储的性能。

性能的指标和测试

上面通过解析用户访问网站的过程来思考怎么提高用户感知的性能,对于用户来言性能就是快和慢。但对于我们来说,不能这样简单描述,我们需要去量化他,用一些数据指标去衡量它。这里讲到几个名词:响应时间、并发量、吞吐量。

 

  • 响应时间:就是用户发出请求到收到响应数据的时间;
  • 并发量:就是系统同时能处理多少用户请求;
  • 吞吐量:就是单位时间内系统处理的请求数量;

 

为了通俗的了解这三个概念,我们以高速公路的收费站为例子:响应时间是指一辆车经过收费站的时间,也就是车辆从进入收费站、付钱、开闸、离开收费站的时间;并发量是指这个收费站同时能通行多少辆车,可以理解为收费站的出口数量。吞吐量是指:在一段时间内,这个收费站通往了多少了车。

这个例子不晓得恰不恰当。

对于性能测试来说,基本也是围绕这些方面来测试,下图说明了性能测试的过程:

左图表示响应时间和并发用户量的二维坐标图,从图上可以看出,并发用户量在一定量增加时,响应时间很短,并且没有太大的起伏,这表示系统目前处于日常运行期,可以很快处理用户请求(A点之前);随着并发量的增加,系统处于请求高峰期,但仍然可以有序的处理用户请求,响应时间较日常有所增加(A、B之间);当并发量增加到一定数量时,超过了系统的负载能力,系统处于濒临崩溃的边缘(B、C之间),响应时间严重过长,直到系统崩溃。

右图表示吞吐量与并发用户量的二维坐标图,可以看出,随着并发用户量的增加,吞吐量逐渐增加;在并发量到达一定量时,由于系统处理能力达到最大,吞吐量增加放缓;当并发量超过系统负载时(E点),系统处理能力开始下降,不能再请求增加的用户请求,吞吐量反而降低。

小结

本文通过用户访问网站的过程,分析了三个路径过程中提高性能的想法和手段,最后介绍了描述性能的指标,并对性能测试做了简要说明。

原文链接: 大型网站的灵魂——性能(责编/仲浩)

关于作者:李平,目前在一家支付企业从事开发、设计等工作。喜欢高效而愉快的工作氛围,支持敏捷,支持重构,抵制加班、抵制外包。熟悉JavaEE、SOA、敏捷开发、移动支付、分布式架构。

分享到:
评论

相关推荐

    大型网站的灵魂——性能

    从本期《问底》开始,我们将为大家带来李平的大型网站打造系列,从理论和实践两个方面进行讲解。在前一篇随笔大型网站系统架构的演化中,介绍了大型网站的演化过程,期间穿插了一些技术和手段,我们可以从中看出一个...

    清华大学DeepSeek从入门到精通(视频课程+PDF)

    【清华大学】DeepSeek从入门到精通(视频课程+PDF)

    更新-“双高计划”专业群完整申报书与建设方案/中期评估报告

    自2019年以来,教育部启动实施“双高计划”,遴选确定首批“双高计划”建设单位197所,其中高水平学校建设单位56所,高水平专业群建设单位141所,河南省有黄河水利职业技术学院、河南工业职业技术学院等6所职业学校入选。2022年,教育部开展国家“双高计划”中期绩效评价,从评价结果看,国家“双高计划”任务进展顺利,建设成效突出,形成了一批先进经验做法和典型案例,在引领职业教育改革、服务国家战略和支撑区域发展方面形成示范势头。 今天,我们给大家分享一些“双高计划”专业群完整申报书与建设方案和中期评估报告。 ## 一、专业群完整申报书与建设方案 ## 二、“双高计划”中期报告 (100多份)

    电子商务平台秒杀系统减库存设计的核心逻辑与优化策略解析

    内容概要:本文详细探讨了电商平台上秒杀系统中减库存的设计逻辑和技术优化方法。首先,文中阐述了‘下单减库存’、‘付款减库存’和‘预扣库存’三种常见方式及其各自面临的问题和局限性,尤其是面对高并发流量冲击下的系统稳定性与数据准确性保障挑战。接着讨论了适用于大规模促销活动中快速而精准地扣除存货的方法,提出了诸如应用本地缓存(Local Cache)、引入高性能持久化键值存储(如Redis),甚至修改数据库引擎源代码(InnoDB 层面排队机制)等一系列先进解决方案来确保交易流程顺畅。此外,还提到了在极端情况发生(例如超卖)时如何借助补救措施挽回损失的具体实例。 适合人群:电商平台开发运维技术人员;有兴趣深入了解电商业务架构和技术优化的开发者和IT管理人员。 使用场景及目标:①帮助设计师理解不同减库存策略的应用时机及其利弊;②指导程序员针对特定业务需求选择最适合的技术路径进行项目构建;③提供给运维专家关于改善在线交易平台响应速度和服务质量的专业见解。 其他说明:本篇文章对于构建高效的电子商贸系统有着极高的参考价值,尤其是那些准备应对瞬息万变市场环境下的企业来说尤为重要。它不仅限于理论探讨层面,

    动态表单,VUE动态表单 基于vue+elementplus实现动态表单组件,通过拖拽组件到面板即可实现一个表单 支持各个组件的动态隐藏显示,动态表格弹窗式维护

    动态表单,VUE动态表单。基于vue+elementplus实现动态表单组件,通过拖拽组件到面板即可实现一个表单。支持各个组件的动态隐藏显示,动态表格弹窗式维护。

    【毕业设计】java-springboot-vue家居日用小百货交易网站实现源码(完整前后端+mysql+说明文档+LunW).zip

    【毕业设计】java-springboot-vue家居日用小百货交易网站实现源码(完整前后端+mysql+说明文档+LunW).zip

    【毕业设计】java-springboot+vue火锅店管理系统源码(完整前后端+mysql+说明文档+LunW).zip

    【毕业设计】java-springboot+vue火锅店管理系统源码(完整前后端+mysql+说明文档+LunW).zip

    基于springboot+vue的在线教育系统设计与实现(LW+PPT).zip

    随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了微服务在线教育系统的开发全过程。通过分析微服务在线教育系统管理的不足,创建了一个计算机管理微服务在线教育系统的方案。文章介绍了微服务在线教育系统的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。 本微服务在线教育系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,课程信息管理,课程类型管理,学科管理,购买的课程管理,职业规划管理,视频点播管理,我的笔记管理,我的课程管理,消息通知管理,学习交流,试卷管理,留言板管理,试题管理,系统管理,考试管理。用户功能有个人中心,用户管理,购买的课程管理,我的笔记管理,我的课程管理,消息通知管理。因而具有一定的实用性。 本站是一个B/S模式系统,采用SSM框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得微服务在线教育系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高微服务在线教育系统管理效率。 关键词:微服务在线教育系统;SSM框架;MYSQL数据库;Spring Boot

    基于Javascript实现,强化学习QLearning的一个贪吃蛇实例

    javascript 基于Javascript实现,强化学习QLearning的一个贪吃蛇实例.

    编程挑战_Chef卡牌游戏_学习资源_技能提升_1741399339.zip

    python教程学习

    基于springboot+vueIT技术交流和分享平台的设计与实现(LW).zip

    我国科学技术的不断发展,计算机的应用日渐成熟,其强大的功能给人们留下深刻的印象,它已经应用到了人类社会的各个层次的领域,发挥着重要的不可替换的作用。信息管理作为计算机应用的一部分,使用计算机进行管理,具有非常明显的优点,利用网络的优势特开发了本基于Spring Boot的IT技术交流和分享平台。 本IT技术交流和分享平台是基于Spring Boot框架,采用Java技术,MYSQL数据库进行开发的。系统具有灵活的一体化设计方式,圆满完成了整个系统的界面设计。本系统实现了用户功能模块和管理员功能模块两大部分,通过该系统用户可以快速进行IT技术交流和分享,管理员可登录系统后台对系统进行全面管理,确保系统正常稳定的运行。系统功能齐全,符合用户IT技术交流和分享的需求。 本文主要首先介绍了课题背景、设计原则和研究内容,系统采用的相关技术及开发平台,接着对本基于Spring Boot的IT技术交流和分享平台进行系统需求分析和设计,包括系统的功能模块,数据库的设计,系统结构以及系统界面设计等,最后对进行系统测试,完成本篇论文。 关键词:IT技术交流, Spring Boot框架, Java技术,MYSQL数据库

    疲劳检测yawn图片数据集

    疲劳检测yawn图片数据集

    JDK7通过java-jwt验证

    JDK7通过java-jwt验证

    【毕业设计】java-springboot+vue会议管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip

    【毕业设计】java-springboot+vue会议管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip

    sksalahuddin2828_Python_1741398999.zip

    python学习资源

    51CTO 1、技术解析篇-DeepSeek入门宝典 2、开发实战篇-DeepSeek入门宝典 3、行业应用篇-DeepSeek入门宝典 4、个人使用篇-DeepSeek入门宝典

    51CTO 1、技术解析篇-DeepSeek入门宝典 2、开发实战篇-DeepSeek入门宝典 3、行业应用篇-DeepSeek入门宝典 4、个人使用篇-DeepSeek入门宝典

    机器学习与模式识别领域的PRML习题解析手册

    内容概要:本文档是由高正奇编辑的针对模式识别和机器学习(PRML)教科书的一份详细的解答手册。文档覆盖了从基本概念如误差函数求导、贝叶斯定理应用到多元高斯分布计算、Gamma函数积分及其性质等一系列复杂问题的解决方案,以及涉及线性模型分类的基础练习题、条件概率和联合概率计算等入门级习题。每一题都经过细致推导,帮助学生加深对机器学习相关概念的理解并掌握具体的数学方法。 适合人群:主要适用于正在攻读机器学习、模式识别相关课程的学生,以及从事数据科学工作的专业人士作为深入理解和实践指南。 使用场景及目标:本手册旨在辅助教学过程中遇到的具体难题解析,在研究和实践中作为参考资料进行理论验证和技术难点突破,尤其有助于准备考试或者项目实施时需要巩固知识的应用场合。 其他说明:书中题目涵盖广泛,既有直观的概率论应用,也有复杂的积分变换技巧和最优化思路展示,对于希望提高自身计算能力和解决实际问题能力的学习者非常有价值。但要注意的是,部分内容较为深奥,可能不适合初学者自学使用,最好配合课堂讲解或其他教材一起学习效果更佳。

    编程语言_Python_入门之旅_教程_1741403040.zip

    python学习资源

    RFID-MATLAB的高等数学-CH06.rar

    RFID-MATLAB的高等数学-CH06.rar

    spaceX Ship Flight Test 8

    spaceX 动力学分析

Global site tag (gtag.js) - Google Analytics