4.瞬时响应:网站高性能架构

网站性能指标:响应时间,吞吐量,TPS,HPS,QPS
对于用户和开发人员,对网站性能的感受是不一样的

网站性能测试
用户视角性能
一般是指网页打开速度
优化手段
优化HTML式样
利用浏览器的并发和异步的特性
调整浏览器缓存策略
使用CDN
反向代理让
用户轻易地拿到热点,经常访问的内容

开发人员视角性能
程序本身和子系统的性能
包括响应延迟
系统吞吐量
并发处理能力
系统稳定性
优化手段
缓存加速数据读取
使用集群提高并发能力
使用异步消息请求加快请求响应
优化代码

运维人员视角性能
基础性能和资源利用率
带宽能力、服务硬件胚子、服务器和网络贷款资源利用率
优化手段
使用高性价比服务器
利用虚拟优化技术
优化骨干网

性能测试指标
响应时间
并发数
吞吐量
性能计数器

响应时间
数据库查询一条数据:10+ ms
机械硬盘进行一次寻址定位:4 ms
机械硬盘读取1MB数据:2 ms
SSD读取1MB数据:0.3 ms
利用远程分布式redis读取一个数据:0.5 ms
内存读取1MB数据:10+ us
Java 本地方法调用一次:<10 us
网络传输2KB数据: 1 us

并发数
对系统来说:同时处理请求的数目
对网站来说:同时提交请求用户数目
网站系统用户总数 >> 网站在线用户总数 >> 网站并发用户总数
设计初期,运维人员就要进行用户数量推算来设计系统功能

吞吐量
指,单位时间系统处理的请求数量
使用 请求数/秒 页面数/秒 来表示
TPS
QPS
HPS(http per second),每秒http请求数
系统并发数少不一定是好事,网站优化目的是:改善用户响应时间、尽量提高系统吞吐量、最大限度利用服务器资源

性能计数器
指标,系统监控重要参数
System load(系统负载),正在被CPU执行和等待CPU的总进程数目,反映了系统闲忙度
对象和线程数
内存使用
CPU使用
网络和磁盘I/O

性能测试方法
分为 性能测试、负载测试、压力测试、稳定性测试
性能测试
以系统设计预期为目标,不断施加压力,看能否到达预期
负载测试
在性能测试之上,再继续施加压力,直到系统某项或者多项性能指标达到安全临界值
压力测试
在负载测试之上,超过安全负载之后,继续施加压力,直到系统崩溃或者不再能处理任何请求,获得系统能承受的最大压力值
稳定性测试
让系统在特定的硬件、软件和网络条件下,给系统压力,使系统运行较长一段时间,检测稳定性。

性能优化策略
性能分析
必须对请求的各个环节进行检查,排查可能出现性能瓶颈的地方
检查日志,分析哪个环节响应时间不合理,检查监控数据:内存、磁盘、网络、CPU
性能优化
web前端优化
应用服务器优化
存储服务器性能优化

Web前端性能优化
浏览器加载
网站视图模型
图片服务
CDN服务

浏览器访问优化
减少http请求,由于http的无状态性,每次http请求都要建立连接,建立单独的线程处理请求
手段
合并CSS
合并js
合并图片
使用浏览器缓存
图片、CSS等静态资源一般很少有改变,因此可以设置较长时间的缓存,设置http头中的Cache-Control 和 Expires设置浏览器缓存
如果在使用浏览器缓存的时候,很多静态资源需要更新,那么要采用增量更新方式,以免对服务器的请求突然暴增,例如如果更新100个图片,那么不适宜一次更新完,不然会对服务器压力突然增大
使用压缩
服务器端进行压缩,客户端进行解压缩,减少网络传输数据量
对文本、HTML、CSS、js使用GZip压缩
CSS放在页面最上面,js放在最下面
由于js会在加载后立即执行,因此会有段时间等待,所以最好放在下面
CSS等到完全下载完才会执行渲染,因此,可以放在上面
减少Cookie传输
Cookie包含在每次请求和响应中,因此太多Cookie会影响传输,所以要减少

CDN加速
CDN(Content Distribution Network)
本质是缓存,将数据缓存在离用户最近的地方
是网络访问的第一跳
通常放静态资源,而且这些资源最好不要长期变更

反向代理
传统代理服务器在客户端一侧,反向代理服务器在服务端一侧
网络请求都必须经过反向代理服务器
可以通过配置缓存加速web请求
一般将静态内容缓存在反向代理服务器上
动态内容也可以缓存,但是动态内容有变化,内部机制要通知反向代理服务器进行更新
负载均衡功能

应用服务器性能优化
手段
缓存,是网站性能优化第一定律,优先使用
集群
异步
代码优化
分布式缓存
缓存的介绍
是首选解决方案
缓存存在于浏览器、应用服务器、数据库服务器
可以对数据缓存、对文件缓存、对页面片段缓存
主要用于读写比很高,很少变化的数据,例如商品类别、热门词、热门商品
web数据访问符合二八定律,20%的数据是经常要访问的,缓存起来
缓存基本原理
缓存访问速度快、减少数据访问时间
如果某些数据是通过计算得到的,那么缓存起来就不需要再重复计算了
本质是 hash 表,读写复杂度 O(1)
合理使用缓存
如果使用不合理,过分依赖缓存,不恰当地使用缓存的数据访问特性,会成为系统的累赘
频繁修改的数据
如果保存的是需要频繁修改的数据,那么可能数据写入缓存,还没有在缓存里读取,就要再修改数据库,那么缓存就没用了
没有热点的访问数据
缓存使用内存存储,如果将普通数据缓存,造成浪费,要缓存符合二八定律的数据,否则,有些数据缓存起来还没读取就被挤出去了
数据不一致的脏读
一般对数据设置失效时间,超过则需要重读于数据库,需要容忍一定时间的数据不一致
有些延迟是可以接受的:
例如商家编辑商品、上架商品,过一段时间再处理
缓存可用性
雪崩:缓存服务器崩溃或者同时大量数据过期,造成瞬时数据库压力过大而宕机
如果是缓存服务器崩溃:搭建集群
如果是大量数据同时过期:设置不同的过期时间或者设置 基础过期时间+随机过期时间
穿透:不恰当的业务或者恶意攻击,反复请求不存在的数据,对数据库造成压力
解决办法:将不存在的数据也缓存起来,返回空值或者无效值
缓存预热:如果直接启动缓存服务器,会造成数据库压力太大。因此,可以先将一些数据先加载到缓存里,然后再与数据库进行连接
分布式缓存
JBoss Cache:缓存更新同步,也就是,缓存需要不断同步
Memcache:不相互通信,缓存相互独立,不通信和同步
很好实现线性扩容、很好的无限制伸缩性(一致性哈希)
通信所需协议:<通信协议><通信序列化协议>
使用了TCP
使用命令关键字的序列化协议书写规范 例如:get
支持丰富语言:java C C++ PHP等
高效内存管理
使用了固定空间分配 Page.51

异步操作
使用消息队列,服务器接收到请求,先不处理,加入消息队列,然后i直接告诉客户端已经接收到了响应,再有时间去处理请求。
可以降低负载压力峰值,(削峰)
任何可以晚点做的事情都要尽量晚点做
例如增加商品,先加入消息队列,然后以其他方式告诉商家已经添加完毕了,然后过一段时间才能在页面上看到商品已经添加成功了

使用集群
使用负载均衡构建由多个服务器组成的集群,将并发访问分配到多个服务器上

代码优化
多线程,由于IO阻塞和多CPU,使用多线程会更好,IO阻塞的时候会释放CPU,CPU可以执行其他任务,可以最大限度使用CPU资源
将对象设置为无状态对象
就是这个对象没有任何属性信息,没有任何成员变量,或者它的引用也没有任何属性信息和成员变量,Servlet对象就设计为了无状态的
web贫血模型都是无状态对象
使用局部对象
在方法内部创建对象,如果无意传出,不会引发多线程并发情况
并发访问资源使用锁
就是多线程访问的时候,使用锁变为串行访问
现在的java引入了轻量级锁,获取锁和释放锁代价变小
锁导致并发执行的线程变串行,对系统性能产生严重影响
资源复用
单例模式
适用于那些,对象不会经常发生改变的对象,例如 dao层和service层,都使用spring进行单利模式设计
现在的web都是贫血模式,单例模式得到很好应用
对象池
每个web请求都回建立单独线程执行,那么使用对象池很好
数据结构
灵活采用算法和数据结构会对系统性能有提升
String 一般采用 Time33 算法,使得 hash值分布均匀
但是对于 AB AA 这种,计算的hash值很接近,那么就可以采用 采集指纹再hash的方法
原始字符串 -->经过MD5计算采集到指纹 --> 经过hash计算 -->哈市Code
垃圾回收
新生代
分为3个区,Eden、From、To
Eden存放刚创建的对象
Eden满之后,触发 Yong GC 将所有对象复制到From区
Eden再次满,触发 Yong GC 将Eden 和 From区对象复制到 To,且From区对象年龄加1,达到一定值会被转移到老年代
老年代
当 老年代 区满,触发 Full GC,会对系统产生比较大影响

存储性能优化
机械硬盘,每次寻指定位花费时间较长
SSD,类似于内存,随机读取
B+ 树
数据库采用两级索引 B+ 树,最多3层,查询记录仅需查询3次,1.第一次查根 2.第二次查根的子节点 3.第三次拿到行号,拿到行号之后就可以在磁盘上查了
更新记录需要 5 次磁盘访问,拿到行号,再进行一次 读 操作和一次 写 操作 即可
LSM 树
是 N 阶合并树,合并过程等都在内存中进行
当写操作很多,使用 LSM 树,可以降低磁盘访问次数
RAID
RAID 0
RAID 1
RAID 10
RAID 5
RAID 6
HDFS (Hadoop distribution file system),Hadoop分布式文件系统
以块为管理文件内容的单位,一个文件被分为多个块block,每写完一个block,同步到其它两个机器上做备份,这样有3台机器的数据一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值