性能
性能测试指标
响应时间(Response-Time)
- 概念: 应用执行一个操作需要的时间,包括从发出请求开始到收到最后响应数据所需时间
-
常用方法: 重复请求计算平均值,即为平均响应时间
并发数
- 概念: 系统能够同时处理请求的数目,这个数字也反映了系统的负载
- 常用方法: 通过多线程模拟并发用户(注:并不是多线程不停请求,而是在两次请求间加入一个随机等待时间,这个时间被称为思考时间)
吞吐量
- 概念: 单位时间内系统处理的请求数量,体现系统的整体处理能力,常用的有TPS(每秒事务数),HPS(每秒HTTP请求数),QPS(每秒查询数)
- 吞吐量/并发数/响应时间三者关系: 吞吐量是每天通过收费站的车辆数量,并发数是正在行驶的车辆数目,响应时间是车速.车辆少时,车速快,收费少;车辆稍多,车速略受影响,收费增加;车辆继续增多,高速堵车,车速变慢,收费变少;车辆继续增加超过极限,高速瘫痪,车走不动,高速费也收不着,此刻资源耗尽
-
网站优化目的: 改善用户体验的响应时间,提高系统吞吐量, 最大限度利用服务器资源
性能计数器
- 概念: 描述服务器或操作系统性能的一些数据指标,包括System Load/对象与线程数/内存使用/CPU使用/磁盘与网络I/O等指标
-
系统负载: System Load即系统负载,指当前正在被CPU执行和等待被CPU执行的进程数目总和,是反映系统忙闲程度的重要指标.Load理想值是CPU数目;Load值低于CPU数目时,表示CPU有空闲;Load值高于CPU数目时,表示进程在排队等待CPU调度,表示系统资源不足,影响应用程序执行性能;Linux系统中使用top命令查看,该值是三个浮点数,表示最近1分钟,10分钟,15分钟的运行队列平均进程数
性能测试方法
性能测试
- 概念: 以系统设计初期规划的性能指标为预期目标,对系统不断施加压力,验证系统在资源可接受范围内,是否能达到性能预期
- 测试目标: 评估系统性能是否符合需求及设计目标
负载测试
- 概念: 对系统不断地增加并发请求以增加系统压力,直到系统的某项或多项性能指标达到安全临界值
- 测试目标: 评估当系统因为突发事件超出日常访问压力的情况下,保证系统正常运行情况下能够承受的最大访问负载压力
压力测试
- 概念: 超过安全负载的情况下,对系统继续施加压力,直到系统崩溃或不能再处理任何请求,以此获得系统最大压力承受能力
- 测试目标: 评估可能导致系统崩溃的最大访问负载压力
稳定性测试
- 网站的日常运行区间: a-b段
- 系统的最大负载点: c点
-
系统的崩溃点: d点
性能测试报告
反映上述性能测试曲线的规律
性能优化策略
性能分析
- 排查性能瓶颈方法: 检查请求处理的各个环节的日志,分析哪个环节响应时间不合理;检查监控数据,分析影响性能的主要因素是内存/磁盘/网络/CPU,是代码问题还是架构设计不合理,或者系统资源确实不足
性能优化
- 分为Web前端性能优化/应用服务器性能优化/存储服务器性能优化
Web前端性能优化
- 浏览器访问优化
- 减少HTTP请求
- 使用浏览器缓存
- 启用压缩
- CSS放在页面最上面/JavaScript放在页面最下面(加载JS可能会阻塞整个页面)
- 减少Cookie传输
- CDN加速
CDN一般缓存静态资源,如图片/文件/CSS/Script脚本/静态网页
- 反向代理
- 安全功能
缓存功能: 内部通知反向代理服务器缓存失效,反向代理重新加载缓存
应用服务器性能优化
- 分布式缓存
- 网站性能优化第一定律: 优先考虑使用缓存优化功能
缓存的基本原理: 将数据存储在相对较高访问速度的存储介质中;本质是一个内存Hash表,数据读写复杂度O(1);存放读写比很高/很少变化的数据
合理使用缓存
- 频繁修改的数据: 一般来说,数据读写比在2:1以上,缓存才有意义
- 没有热点的访问: 大部分数据还没有被再次访问就被挤出缓存
- 数据不一致与脏读: 数据更新时更新缓存会带来数据不一致问题
- 缓存可用性: 缓存雪崩(缓存服务崩溃,数据库无法承受压力而宕机,导致网站不可用)
- 缓存预热(warm up): 启动时加载数据库到缓存预热;利用LRU(最近最久未用算法)淘汰缓存数据
- 缓存穿透: 恶意攻击持续高并发请求不存在的数据,由于缓存未保存,给数据库带来很大压力,甚至崩溃.简单对策是将不存在的数据也缓存起来
分布式缓存架构:一种以JBoss Cache为代表的需要更新同步的分布式缓存(所有服务器保存相同的缓存数据,受限于单一服务器内存空间),一种以Memcached为代表的互不通信的分布式缓存(应用程序通过一致性Hash等路由算法选择缓存服务器访问缓存数据,具备良好的可伸缩性)
- 异步操作
消息队列: 任何可以晚点做的事情都应该晚点再做
- 使用集群
负载均衡
- 代码优化
- 多线程: 使用多线程原因为IO阻塞和多CPU,最大限度使用CPU.启动线程数 = [任务执行时间 / (任务执行时间-IO等待时间)] * CPU内核数
- 资源复用: 系统运行时,尽量减少开销很大的系统资源的创建和销毁,如数据库连接/网络通信连接/线程/复杂对象等.主要有两种模式单例(Singleton)和对象池(Object Pool)
- 数据结构: 程序 = 数据结构 + 算法
垃圾回收: JVM分代垃圾回收机制
存储服务器性能优化
- 机械硬盘 VS 固态硬盘
- 机械硬盘: 快速顺序读写,慢速随机读写特性
- 机械硬盘: 数据存储在可持久记忆的硅晶体上,可靠性和性价比有待提高
- B+树 VS LSM树
- RAID VS HDFS
- RAID: 廉价磁盘冗余队列, 改善磁盘的访问延迟, 增强磁盘可用性和容错能力, 实现数据在多块磁盘上的并发读写和数据备份
- HDFS: 以块(Block)为单位管理文件内容,一个文件被分割成若干个Block,每写完一个Block,HDFS将其自动复制到另外两台机器上,保证每个Block有三个副本