架构_Web高性能架构


零. 核心问题

  1. 网站的性能怎么评估?
    • 用户/开发/运维
    • 网站性能指标有哪些?
    • 如何得到性能的指标?
  2. 网站的性能如何优化?
    • 前端优化?
    • 后端优化?
    • 存储优化?

一. 网站性能的评估


1. 不同视角

  • 从用户:
    1. 加载出频率
    2. 加载的速度
  • 从开发:
    1. 延迟
    2. 吞吐量
    3. 稳定性
  • 从运维
    1. 硬件配置
    2. 网络架构
    3. 资源利用率:带宽/CPU/硬盘

2. 具体的指标

  • 响应时间(系统的快慢)
    • 应用执行一个操作的时间
      • 打开网站 几秒
      • 数据库查询有索引的数据 十几毫秒
      • 机械硬盘一次寻址定位 几毫秒
      • 从内存中读取1MB数据 几十微米
  • 并发数(系统负载能力)
    • 系统能够同时处理请求的数目
      • 用户数 » 在线用户数 » 并发用户数
  • 吞吐量(系统处理能力)
    • 单位时间内系统处理的请求数量
      • TPS: 每秒事务数
      • QPS: 每秒查询数
      • HPS: 每秒请求数
  • 性能计数器(操作系统/服务器性能的指标)
    • System Load(系统忙闲程度)
      • 系统负载,正在被CPU和等待CPU执行的进程总数
    • 对象与线程数
    • CPU使用
    • 磁盘I/O
    • 网络I/O

3. 性能测试方法

  • 性能测试:
    • 测试是否达到最初的设计目标
    • 验证系统在资源可接受范围内能否达到性能预期
  • 负载测试
    • 对系统不断增加并发请求以增加系统压力,当系统的各项性能达到安全临界值
  • 压力测试
    • 获取系统的最大承受力
    • 在超过安全负载情况下,对系统继续施加压力,直到系统崩溃
  • 稳定性测试
    • 在一定条件下,对系统加载一定的业务压力
    • 使系统运行一段较长时间,以此检测系统是否稳定
  • 性能测试报告
    • 并发/响应/TPS/错误/Load/内存

二. 网站性能的优化


1. 前端性能优化

  1. 浏览器访问优化
    • 减少HTTP请求
    • 使用浏览器缓存
    • 启用压缩
      • 压缩对于服务器和浏览器产生一定的压力
      • 要权衡带宽和服务器资源
    • CSS居最上,JS居最下
      • CSS全部下载完才会对整个界面渲染
      • 浏览器加载JS后立即执行,可能会阻塞界面
    • 减少Cookie传输
      • 太大的Cookie影响数据传输
  2. CDN加速
    • Content Distribute Network
    • 本质是将数据缓存中距离用户最近的地方
    • 一般用于缓存静态资源:图片、文件、CSS、Script、静态网页
  3. 反向代理
    • 将用户请求转发到Web服务器集群
    • 可以通过配置缓存加速Web请求
    • 实现负载均衡功能

2. 服务端性能优化

  1. 分布式缓存
    • 缓存原理
      • 网站优化优先考虑使用缓存
      • 缓存主要用来存放读写比很高、很少变化的数据
    • 合理使用缓存
      • 不恰当使用缓存的情况
        • 频繁修改的数据
        • 没有热点的访问
        • 数据不一致与脏读
      • 几个重要概念
        • 缓存雪崩
          • 大规模缓存失效,导致数据库会因为不能承受压力而宕机
        • 缓存预热:
          • 缓存系统重启时把热点数据加载好
        • 缓存穿透:
          • 请求不存在的数据,由于不存在缓存,对数据库造成很大压力
    • 分布式缓存架构
      • Redis
      • Memcached
  2. 异步操作
    • 消息队列
      • 作用
        • 削峰
        • 改善性能
      • 常见
        • Kafka
        • RocketMQ
        • RabbitMQ
  3. 使用集群
    • 负载均衡为一个应用构建由多台服务器组成的服务器集群
  4. 代码优化
    • 多线程
      • IO阻塞/多CPU
      • 线程安全问题
      • 最佳启动线程数与CPU内核数量成正比
      • 最佳启动线程数与IO等待时间成正比
      • 计算型任务,线程数最多不超过CPU内核数
      • 任务需要等如磁盘操作、网络响应,启动多线程有助于提高任务
    • 资源复用
      • 单例
      • 对象池
    • 数据结构
      • 这个重要性不多言
    • 垃圾回收
      • JVM
        • heap
        • stack
        • Young Genetation
        • Old Genetation

3. 存储性能优化

  1. SSD - HHD
    • Solid State Drives
    • Hard Disk Drive
    • 对比参数:
      • 读取速度
      • 抗震能力
      • 功耗
      • 噪声
      • 容量
      • 价格
      • 写入次数
      • 数据恢复
  2. B+树 - LSM树
    • 传统关系型数据库:B+树
    • LSM树可以看作是一个N阶合并树
  3. RAID - HDFS
    • RAID: 廉价磁盘冗余阵列
    • HDFS: Hadoop分布式文件系统

三. 总结

  1. 性能优化的最终目的就是改善用户的体验
  2. 性能优化也需要全面考虑
    • 花费代价与获得的体验提升之间的平衡