全网最详细的网站(前端、后端)性能(架构)优化手段

全网最详细的网站(前端、后端)性能(架构)优化手段

网站的性能测试

  性能测试是性能优化的前提,也是性能优化结果的检查和度量标准。舒适提示:本文内容有点长,请耐心看完或者先收藏。前端

性能测试的经常使用指标:

  • 响应时间
  • 并发数目
  • 吞吐量。经常使用的吞吐量指标:

  ①TPS(每秒事务数)web

  ②HPS(每秒Http请求数)面试

  ③QPS(每秒查询数,)算法

  • 性能计数器。经常使用的性能计数器有:system Load、对象和线程数、CPU使用、内存使用、磁盘和网络IO等指标。 性能测试的几个参考点:
  • 性能测试
  • 负载测试:系统的某项或者多想性能指标达到安全临界值时的并发数
  • 压力测试
  • 稳定性测试。PS:稳定性测试主要是长时间给系统必定的压力,看系统是否正常运行。

网站的性能优化三维度

  • 浏览器访问优化
  • 应用服务器性能优化
  • 存储优化

前端经常使用的优化方式

  • 减小Http请求

  减小Http请求的主要手段是合并CSS、合并JS、合并图片(页面引用时使用CSS偏移)数据库

  • 使用浏览器缓存

  经过设置Http头中的Cache-Control和Expires的属性。静态资源的更新不要直接更新文件内容,要经过更改文件名的方式更新。更新讲台资源的时候使用逐量更新。编程

  • 启用压缩

  使用GZIP压缩,在服务端对文件进行压缩,在浏览器端对文件解压缩能够减小通讯传输的数据量。可是该种方式会对服务器产生必定的压力,在款低啊良好而服务器资源不足的状况下要权衡考虑。后端

  • CSS文件放在页面最上面,js脚本放在页面最下面

  浏览器会在下载彻底部的CSS以后才会对页面进行渲染,因此最好的方式是把CSS放在页面最上面;可是JS则相反(若是页面解析时就要用的js仍是要放在最上面)。浏览器

  • 减小Cookie传输

  好比用户的登陆信息,能够考虑使用拦截器,在用户登陆的时候把登陆信息和用户的相关信息存放在ThreadLocal里面。缓存

  • CDN加速

  CDN的本质就是把资源放在离用户最近的地方,CDN可以缓存的通常是静态资源,如图片、文件、CSS、js脚本,静态网页。安全

  • 反向代理

  反向代理服务器的两个用途:

  ①保护网站安全;

  ②配置缓存功能能够加速web请求;

  ③负载均衡,能够提升网站的并发数


后台服务器经常使用的优化方式

  • 缓存
  • 集群
  • 异步
  • 代码优化
  • 存储优化

缓存相关知识

  后台性能优化的第必定律:优先考虑使用缓存优化性能。

  • 缓存的本质
  • 缓存的合理使用
  • 缓存可用性
  • 缓存的常见问题处理与优化
  • 分布式缓存架构

缓存的本质

  缓存的本质就是一个内存Hash表,数据以一对Key\Value键值对存储在内存Hash表中。主要用户存放读写比很高、不多变化的数据,网站数据一般遵循“二八定律”,即80%的访问落在20%的数据上,所以,将这20%的数据缓存起来,能够很好的改善系统性能。

合理的使用缓存

  合理的使用缓存对提升系统性能有不少好处,可是不合理的使用缓存反而会成为系统的累赘甚至风险。滥用缓存的三种状况以下:

  • 频繁修改的数据

  数据的读写比至少应该是2:1以上,即写入一次缓存,在数据更新前至少读写两次,缓存才有意义。真正实践中这个比例可能会更高。

  • 没有热点的访问

  若是应用系统访问数据没有热点,不遵循二八定律,即大部分数据访问并无集中在小部分数据中,那么缓存也没有意义,由于大部分数据尚未被再次访问就已经被挤出缓存了。

  • 数据的不一致与脏读

  写入缓存的数据最好能容忍必定时间的数据不一致,通常状况下最好对缓存的数据设置失效时间(固定值+必定范围的随机值)。若是不能容忍数据的不一致,必须在数据更新时,删除对应的缓存(思考:为何不是更新缓存),可是这种状况只针对读写比很是高的状况。


缓存的常见问题优化手段

  • 缓存雪崩

  缓存雪崩咱们能够简单的理解为:因为原有缓存失效,新缓存未到期间(例如:咱们设置缓存时采用了相同的过时时间,在同一时刻出现大面积的缓存过时),全部本来应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存形成巨大压力,严重的会形成数据库宕机。从而造成一系列连锁反应,形成整个系统崩溃。

  该类问题的解决方式主要有三种:

  ①加锁排队。大概原理是在去数据库取数据的时候加锁排队,该方法仅仅适用于并发量不高的状况。

  ②在原有失效时间基础上加一个合理的随机值(0-5分钟)。分布式场景下最多见的方式(单机也能够)。

  ③给缓存加标记,在缓存失效以后更新缓存数据。

  • 缓存穿透

  缓存穿透是指用户查询数据,在数据库没有,天然在缓存中也不会有。这样就致使用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,而后返回空(至关于进行了两次无用的查询)。

  该类问题的主要解决方式。

  ①使用布隆过滤器作过滤。该方法仅仅用于查询一个不可能存在的数据

  ②把不存在的数据也缓存起来。最佳实践:单独设置比较短的过时时间,好比说五分钟。

  • 缓存预热

  缓存中存放的是热点数据,热点数据又是缓存系统利用某种算法对不断访问的数据筛选淘汰出来的,在重建缓存数据的过程当中,系统的性能和数据库负载都不太好,那么多好的方式就是在缓存系统启动的时候就把热点数据加载好,这个缓存预加载的手段叫作缓存预热。对于一些元数据如省市区列表,类目信息,就能够在启动的加载数据库中的所有数据。


分布式缓存架构

  分布式缓存是指缓存部署在多个服务器组成的集群中,以集群方式提供缓存服务,其架构方式有两种: ①以JBosss Cache为表明的须要更新同步的分布式缓存(在全部服务器中保存相同的缓存数据)。 ②以Memcache为表明的互不通讯的分布式缓存(应用程序经过一致性Hash等路由算法选择缓存服务器远程访问远程数据,能够会容易的扩容,具备良好的可伸缩性)。


异步

  使用异步操做,能够大幅度改善网站的性能,使用异步的两种场景,高并发、微服务; ①高并发,在不使用消息队列的状况下,用户的请求数据直接写入数据库,在高并发的状况下会对数据库形成必定的压力,同时也使得响应延迟加重。使用消息队列具备很好的削峰做用,在电子商务网站促销活动中,使用消息队列是常见的技术手段。 ②微服务之间调用,在微服务流行的当下,有时候咱们调用其余系统的微服务接口,只是为了通知其余系统,咱们不关心结果,这个时候咱们可使用单独的线程池异步调用其余系统的微服务,这样能够减小程序的响应时间。    任何能够晚点的事情都应该晚点再作。


集群

  在网站高并发访问的场景洗下,使用负载均衡技术为一个应用构建一个由多台服务器组成的服务器集群,能够避免单一服务器因负载压力过大而响应缓慢。经常使用的负载均衡技术有如下几种:

HTTP重定向负载均衡,不利于SEO,不推荐。

DNS域名解析负载均衡,许多DNS服务器还支持基于地理位置的域名解析,会将域名解析成距离用户地理最近的一个服务器地址,这样能够加快访问速度。大公司经常使用的手段

反向代理负载均衡(应用层负载均衡),常见产品:Nginx,反向代理服务器的性能可能会成为瓶颈。

IP负载均衡,在内核进程完成数据分发,叫反向代理负载均衡有更好的处理性能,网卡和带宽会成为主要的瓶。

数据链路层负载均衡(三角传输模式),又名DR(直接路由模式),也是大型网站昌运宫的负载均衡手段,在Linux平台上最好的链路层负载均衡产品是LVS


代码优化

  网站的业务逻辑实现代码主要部署在应用服务器上,合理的优化代码也能够很好的改善网站性能。几种经常使用的几种代码优化方式:

①合理使用多线程,服务器的启动的线程数参考值:*[任务执行时间/(任务执行时间-IO等待时间)]CPU内核数

②资源复用,要尽可能减小那些开销很大的系统资源的建立和销毁,好比数据库链接,网络通讯链接、线程、复杂对象,从编程角度,资源复用主要有两种方式,单例、对象池。

③数据结构,前面缓存部分就已经提到了Hash表的基本原理,Hash表的读写性能在很大程度上依赖于HashCode的随机性,即HashCode越散列,Hash表的冲突就越少,目前比较好的Hash散列算法是Time33算法,算法原型为:hash(i) = hash(i-1)*33+str[i]

④垃圾回收,好比说在JVM里,合理设置Young Generation和Old Generation的大小,尽可能减小Full GC,若是设置合理的话,能够在整个运行期间作到从不进行Full GC。


存储优化

  在网站应用中,海量是的数据读写对磁盘访问会形成必定的压力,虽然能够经过Cache解决一部分数据读压力,可是不少时候,磁仍然是系统最严重的瓶颈。

  • 机械硬盘VS固态硬盘

  这两个的区别我相信你们都知道了吧,机械硬盘是经过马达驱动磁头臂带动磁头到指定的磁盘位置访问数据,这个效率我就不用多说了吧,相反,固态硬盘的数据是存储在能够持久记忆的硅晶体上,所以能够像内存同样随机访问,并且功耗更小。

  • B+树VS. LSM树

  B+树是一种专门针对磁盘存储而优化的N叉排序树,以树节点为单位存储在磁盘中,从根开始查找所需的节点编号和磁盘位置,将其加载到内存中,而后继续查找,知道找到所需数据,目前大部分关系型数据库多采用两级索引的B+树,树的层次最多为3层。

  目前不少NoSQL产品采用LSM树做为主要的数据结构,LSM树能够看作是一个N阶合并树,数据的写操做都在内存中完成,而且都会建立一个新记录,这些数据在内存中仍然仍是一颗排序树。在须要读的时候,老是从内存中的排序树开始搜索,若是没有找到,就从磁盘的排序树中查找。

  在LSM树上进行一次数据更新不须要磁盘访问,在内存中便可完成,速度远快于B+树,当数据访问以写操做为主,而读操做则集中在最近写入的数据上时,使用LSM树能够极大程度的减小磁盘的访问次数,加快访问速度。

  • RAID VS HDFS

  RAID有不少方案,这里就不细说了,关于RAID的访问速度、数据可靠性、磁盘利用率见下图:

TIM图片20190610001758.png

  在HDFS中,系统在整个存储集群的多台服务器上进行数据的并发读写和备份,能够看作在服务器集群规模上实现了相似RAID的功能,所以不须要磁盘RAID。

  以上就是关于全网最详细的网站性能(架构)优化手段的所有内容,文章有点长,真的不容易,若是以为还不错的话,欢迎转发、关注。

  关注**“Java架构师养成记”,带你装逼带你飞。后台回复“面试突击”**,获取BAT一线互联网高频面试题讲解视频。   欢迎你们关注个人微信公众号,不按期分享各种面试题。

Java架构师养成记.jpg
相关文章
相关标签/搜索