网站性能是客观的指标,可以具体体现到响应时间、吞吐量等技术指标,同时也是主观的感受。
用户视角的网站性能
在实践中,使用一些前端架构优化手段,使浏览器尽快地显示用户感兴趣的内容、尽可能近地获取页面内容。
- 优化页面HTML式样
- 利用浏览器端的并发和异步特性
- 调整浏览器缓存策略
- 使用CDN服务
- 反向代理等手段
开发视角的网站性能
响应延迟、系统吞吐量、并发处理能力、系统稳定性等技术指标
- 使用缓存加速数据读取
- 使用集群提高吞吐能力
- 使用异步消息加快请求响应及实现削峰
- 使用代码优化手段改善程序性能
运维视角的网站性能
基础设施性能和资源利用率
性能测试指标
1响应时间
测试方法:重复请求取平均
2并发数
系统能够同时处理请求的数目,反映了系统的负载
网站系统用户数>>网站在线用户>>网站并发用户数
在网站产品设计初期,产品经理和运营人员就需要规划不同发展阶段的网站系统用户数,并以此为基础,根据产品特性和运营手段,推算在线用户数和并发用户数。
测试方法:多线程模拟并发用户。思考时间。
3吞吐量
单位时间内系统处理的请求数量,体现系统的整体处理能力。TPS/QPS
网站性能优化的目的,除了改善用户体验的响应时间,还要尽量提高系统吞吐量,最大限度利用服务器资源。
4性能计数器
描述服务器或操作系统性能的一些数据指标。
System Load:当前正在被CPU执行和等待被CPU执行的进程数目总和,是反映系统忙闲程度的重要指标。top命令查看
性能测试方法
- 性能测试
- 负载测试:临界值
- 压力测试:系统最大压力承受能力
- 稳定性测试:
- 性能测试曲线
性能优化策略
对请求经历的各个环节进行分析,排查可能出现性能瓶颈的地方,定位问题。
代码问题/架构设计不合理/系统资源不足
Web 前端性能优化
一般说来Web 前端指网站业务逻辑之前的部分,包括浏览器加载、网站视图模型、图片服务、CDN服务等,主要优化手段有:
1优化浏览器访问
- 减少http 请求
HTTP协议是无状态的应用层协议,意味着每次请求都需要建立通信链路、进行数据传输,服务端每个请求都需要启动独立的线程进行处理。这些通信和服务的开销都很昂贵。
合并CSS、合并Js、合并图片 - 使用浏览器缓存
静态资源文件设置浏览器缓存。 - 启用压缩
在服务端压缩文件,在浏览器端解压缩,可有效减少通信传输对数据量。
压缩对服务器和浏览器产生一定压力,要权衡考虑。 - CSS放在页面最上面、JavaScript放在页面最下面
- 减少Cookie传输
Cookie包含在每次请求和响应中,太大的Cookie会严重影响数据传输。
静态资源发送Cookie没有意义,可以考虑使用独立域名访问,减少Cookie传输的次数。
2CDN加速
将数据缓存在离用户最近的地方——网络访问第一跳
CDN部署在网络运营商的机房
一般是静态资源
3反向代理
传统代理服务器位于浏览器一侧,代理浏览器将HTTP请求发送到互联网上
反向代理服务器位于网站机房一侧,代理网站Web服务器接收HTTP请求
- 安全功能
- 配置缓存加速Web请求
- 负载均衡
应用服务器性能优化
应用服务器就是处理网站业务的服务器,优化手段主要有缓存、集群、异步等。
1分布式缓存
网站性能优化第一定律:优先考虑使用缓存优化性能
缓存指将数据存储在相对较高访问速度的存储介质中,以供系统处理。
- 访问速度快
- 缓存被计算的数据,减少重复计算
缓存主要用来存放读写比很高、很少变化的数据
网站数据访问通常遵循二八定律,即80%的访问落在20%的数据上。缓存这20%的数据,可以很好地改善系统性能,提高数据读取速度,降低存储访问压力。
缓存滥用
- 频繁修改的数据:一般数据的读写比在2:1以上,即写入一次,至少读取两次,缓存才有意义
- 没有热点的访问:不遵循二八定律,可能还没有被再次访问就被挤出缓存
- 数据不一致与脏读:容忍一定时间的数据不一致
- 缓存可用性:缓存雪崩,缓存服务器崩溃时,数据库因为完全不能承受如此大的压力而宕机,进而导致整个网站不可用。
- 缓存预热:新启动的缓存系统,在重建缓存数据的过程中,系统的性能和数据库负载都不太好,那么最好在缓存系统启动时就把热点数据加载好。
- 缓存穿透:因为不恰当的业务、或者恶意攻击持续高并发地请求某个不存在的数据,由于缓存没有保存该数据,所有的请求都会落到数据库上,对数据库造成很大压力,甚至崩溃。将不存在的数据也缓存起来。
产品在设计之初就需要一个明确的定位:什么是产品要实现的功能,什么不是产品提供的特性。在产品漫长的生命周期中,会有形形色色的困难和诱惑来改变产品的发展方向,左右摇摆、什么都想做的产品,最后有可能成为一个失去生命力的四不像。
分布式缓存架构
缓存部署在多个服务器组成的集群中。
- JBoss Cache为代表的需要更新同步的分布式缓存:集群中所有服务器中保存相同的缓存数据,更新通知。通常将应用程序和缓存部署在同一台服务器上。内存空间受限、缓存更新代价惊人。
- Memcached为代表的不相互通信的分布式缓存:缓存与应用分离部署。优点:
- 简单的通信协议(TCP/UDP),通信序列化协议
- 丰富的客户端程序
- 高性能的网络通信:事件触发,稳定的长连接
- 高效的内存管理:固定空间分配
- 互不通信的服务器集群架构,客户端路由算法一致性Hash。集群内服务器互不通信使得集群可以做到几乎无限制的线性伸缩。
2异步操作
使用消息队列将调用异步化,可改善网站的扩展性和系统性能。
削峰作用:通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。
3使用集群
负载均衡
4代码优化
多线程
从资源利用的角度看,使用多线程的原因主要有两个:IO阻塞与多CPU。
启动线程数=[任务执行时间/(任务执行时间-IO等待时间)]*CPU核数
线程安全的主要手段:
- 将对象设计为无状态对象——不过从面向对象设计角度看,无状态对象是一种不良设计。贫血模型对象?
- 使用局部对象:在方法内部创建对象
- 并发访问资源时使用锁:将并发操作转化为顺序操作
资源复用
尽量减少那些开销很大的系统资源的创建和销毁,比如数据库连接、网络通信连接、线程、复杂对象等。
两种模式:
- 单例:目前从Service到Dao都是些无状态对象,无需重复创建
- 对象池:复用对象实例,减少对象创建和资源消耗。如数据库连接池、线程池等。
数据结构
垃圾回收
如JVM垃圾回收机制
存储性能优化
传统的机械磁盘具有快速顺序读写、慢速随机读写的访问特性
固态硬盘
B+树——传统关系数据库
LSM树——NoSQL
RAID——传统关系数据库及文件系统
HDFS配合MapReduce——NoSQL及分布式文件系统
网站性能优化的主要工作是改善并发用户访问情况下的网站响应速度。