1. 核心要素
- 性能
- 可用性
- 伸缩性
- 拓展性
- 安全性
五个要素能不能都要呢?
2. 性能
网站的性能是客观的指标,可以具体体现到响应时间、吞吐量等技术指标,同时也是主观感受。
用户视角的性能:
就是用户在浏览器上直观感受到的网站响应速度快还是慢。
开发人员眼中的性能:
- 响应延迟
- 系统吞吐量
- 并发处理能力
- 系统稳定性等
相关的优化手段有:
- 缓存加速读取
- 使用集群提高吞吐能力
- 使用异步消息加快请求响应及实现削峰
- 使用代码手段优化
运维人员视角的性能主要是基础设施性能和资源利用率,包括:
- 网络运营商的带宽能力
- 服务器硬件配置
- 数据中心网络结构
- 服务器和带宽的资源利用率
主要优化手段:
- 建设优化骨干网
- 高性价比定制服务器
- 利用虚拟化技术优化资源
性能测试指标主要有:
-
*响应时间
-
并发数
反映系统的负载特性
网站系统用户数>>网站在线用户数>>网站并发用户数
-
吞吐量
体现系统的整体处理能力,TPS、HPS和QPS
-
性能计数器
性能测试方法:
- 性能测试——性能预期测试
- 负载测试——安全临界值测试
- 压力测试——最大压力承受能力测试
- 稳定性测试——长时间运行稳定性测试
性能优化策略:
思路:如果性能测试结果不满足设计或业务需求,那么就需要寻找系统瓶颈,分而治之,逐步优化
-
性能分析
基本方法:检查请求处理的各个环节日志,分析哪个环节响应时间不合理、超过预期;然后检查监控数据,分析影响性能的主要因素是内存、磁盘、网络或CPU,是代码还是架构设计不合理,或者系统资源确实不足。
-
性能优化
根据网站分层架构,可分为Web前端性能优化、应用服务器性能优化、存储服务器性能优化。
2.1 Web前端性能优化
主要优化手段:优化浏览器访问、使用反向代理、CDN
2.1.1 浏览器访问优化
-
减少HTTP请求
-
使用浏览器缓存
-
启用压缩
-
CSS放最上面,JS放最先
浏览器会在下完全部CSS后才对页面进行渲染,最好的做法是将CSS放在最上面,尽快下载CSS。JS相反,浏览器在加载JS后立即执行,有可能会阻塞整个页面,造成显示缓慢,因此JS最好放在页面最下面。
-
减少cookie传输
2.1.2 CDN加速
2.1.3 反向代理
反向代理的功能= 请求转发+负载均衡+缓存
2.2 应用服务器性能优化
优化手段主要有缓存、集群和异步
网站性能优化第一定律:优先考虑使用缓存优化性能
2.2.1 分布式缓存
缓存穿透 缓存击穿 缓存雪崩
缓存的优势在于:1. 提升IO速度;2. 减少重复计算,同时因为局部性原理的存在,所以缓存很实用
合理使用缓存
使用缓存要注意的问题:
- 频繁修改的数据——刚放了就修改
- 没有热点的访问——存错数据了
- 数据不一致与脏读——实时更新的问题
- 缓存可用性——缓存的稳定性
- 缓存预热——设置缓存的时候加载热点数据
- 缓存穿透——没有命中,都落到数据库上
- 缓存击穿——部分热门数据key过期,导致查询落到数据库上
- 缓存雪崩——大面积的key过期,导致查询直接落到数据库上
一个集群要解决什么问题?
分布式缓存集群的第一个问题:各个集群直接需不需要互相通信?需不需要同步?
代表之作,Memcached,一致性哈希算法等路由算法
Memcached的特点:
-
简单的通信协议
使用TCP协议
-
丰富的客户端程序
支持Memcached的通信协议就可以和Memcached的机器通信
-
高性能的网络通信
通信模块:Libevent,一个支持事件出发的网络通信程序库。
-
高效的内存管理
固定空间分配,使用LRU算法。
-
互不通信的服务器集群架构
使其拥有更好的伸缩性,几乎可以做到线性增长。
2.2.2 异步操作
主要是消息队列。
- 可以削峰
名言:任何可以晚点做的事情都应该晚点再做
2.2.3 使用集群
将请求分散到集群上的不同机器去解决。
2.2.4 代码优化
-
多线程(多协程)
解决线程安全的一些手段:
- 将对象设计为无状态对象
- 使用局部对象
- 并发访问资源时使用锁
-
资源复用
主要的复用方法:减少资源创建时的消耗
- 资源池
- 单例模式
-
数据结构
随机散列算法一般是通过先对字符串取信息指纹,再对信息指纹取hashcode。
-
垃圾回收
提高利用率。
2.3 存储服务器性能优化
2.3.1 机械硬盘vs固态硬盘
2.3.2 B+树vs LSM树
B+树:
B+树一般两层索引,最后一层是叶子ID,一般更