零. 核心问题
- 网站的性能怎么评估?
    - 用户/开发/运维
- 网站性能指标有哪些?
- 如何得到性能的指标?
 
- 网站的性能如何优化?
    - 前端优化?
- 后端优化?
- 存储优化?
 
一. 网站性能的评估
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分布式文件系统
 
三. 总结
- 性能优化的最终目的就是改善用户的体验
- 性能优化也需要全面考虑
    - 花费代价与获得的体验提升之间的平衡