零. 核心问题
- 网站的性能怎么评估?
- 用户/开发/运维
- 网站性能指标有哪些?
- 如何得到性能的指标?
- 网站的性能如何优化?
- 前端优化?
- 后端优化?
- 存储优化?
一. 网站性能的评估
1. 不同视角
- 从用户:
- 加载出频率
- 加载的速度
- 从开发:
- 延迟
- 吞吐量
- 稳定性
- 从运维
- 硬件配置
- 网络架构
- 资源利用率:带宽/CPU/硬盘
2. 具体的指标
- 响应时间(系统的快慢)
- 应用执行一个操作的时间
- 打开网站 几秒
- 数据库查询有索引的数据 十几毫秒
- 机械硬盘一次寻址定位 几毫秒
- 从内存中读取1MB数据 几十微米
- 应用执行一个操作的时间
- 并发数(系统负载能力)
- 系统能够同时处理请求的数目
- 用户数 » 在线用户数 » 并发用户数
- 系统能够同时处理请求的数目
- 吞吐量(系统处理能力)
- 单位时间内系统处理的请求数量
- TPS: 每秒事务数
- QPS: 每秒查询数
- HPS: 每秒请求数
- 单位时间内系统处理的请求数量
- 性能计数器(操作系统/服务器性能的指标)
- System Load(系统忙闲程度)
- 系统负载,正在被CPU和等待CPU执行的进程总数
- 对象与线程数
- CPU使用
- 磁盘I/O
- 网络I/O
- System Load(系统忙闲程度)
3. 性能测试方法
- 性能测试:
- 测试是否达到最初的设计目标
- 验证系统在资源可接受范围内能否达到性能预期
- 负载测试
- 对系统不断增加并发请求以增加系统压力,当系统的各项性能达到安全临界值
- 压力测试
- 获取系统的最大承受力
- 在超过安全负载情况下,对系统继续施加压力,直到系统崩溃
- 稳定性测试
- 在一定条件下,对系统加载一定的业务压力
- 使系统运行一段较长时间,以此检测系统是否稳定
- 性能测试报告
- 并发/响应/TPS/错误/Load/内存
二. 网站性能的优化
1. 前端性能优化
- 浏览器访问优化
- 减少HTTP请求
- 使用浏览器缓存
- 启用压缩
- 压缩对于服务器和浏览器产生一定的压力
- 要权衡带宽和服务器资源
- CSS居最上,JS居最下
- CSS全部下载完才会对整个界面渲染
- 浏览器加载JS后立即执行,可能会阻塞界面
- 减少Cookie传输
- 太大的Cookie影响数据传输
- CDN加速
- Content Distribute Network
- 本质是将数据缓存中距离用户最近的地方
- 一般用于缓存静态资源:图片、文件、CSS、Script、静态网页
- 反向代理
- 将用户请求转发到Web服务器集群
- 可以通过配置缓存加速Web请求
- 实现负载均衡功能
2. 服务端性能优化
- 分布式缓存
- 缓存原理
- 网站优化优先考虑使用缓存
- 缓存主要用来存放读写比很高、很少变化的数据
- 合理使用缓存
- 不恰当使用缓存的情况
- 频繁修改的数据
- 没有热点的访问
- 数据不一致与脏读
- 几个重要概念
- 缓存雪崩
- 大规模缓存失效,导致数据库会因为不能承受压力而宕机
- 缓存预热:
- 缓存系统重启时把热点数据加载好
- 缓存穿透:
- 请求不存在的数据,由于不存在缓存,对数据库造成很大压力
- 缓存雪崩
- 不恰当使用缓存的情况
- 分布式缓存架构
- Redis
- Memcached
- 缓存原理
- 异步操作
- 消息队列
- 作用
- 削峰
- 改善性能
- 常见
- Kafka
- RocketMQ
- RabbitMQ
- 作用
- 消息队列
- 使用集群
- 负载均衡为一个应用构建由多台服务器组成的服务器集群
- 代码优化
- 多线程
- IO阻塞/多CPU
- 线程安全问题
- 最佳启动线程数与CPU内核数量成正比
- 最佳启动线程数与IO等待时间成正比
- 计算型任务,线程数最多不超过CPU内核数
- 任务需要等如磁盘操作、网络响应,启动多线程有助于提高任务
- 资源复用
- 单例
- 对象池
- 数据结构
- 这个重要性不多言
- 垃圾回收
- JVM
- heap
- stack
- Young Genetation
- Old Genetation
- JVM
- 多线程
3. 存储性能优化
- SSD - HHD
- Solid State Drives
- Hard Disk Drive
- 对比参数:
- 读取速度
- 抗震能力
- 功耗
- 噪声
- 容量
- 价格
- 写入次数
- 数据恢复
- B+树 - LSM树
- 传统关系型数据库:B+树
- LSM树可以看作是一个N阶合并树
- RAID - HDFS
- RAID: 廉价磁盘冗余阵列
- HDFS: Hadoop分布式文件系统
三. 总结
- 性能优化的最终目的就是改善用户的体验
- 性能优化也需要全面考虑
- 花费代价与获得的体验提升之间的平衡