概述
性能是网站的一个重要指标, 除非是没得选择 (比如 12306), 否则用户无法忍受一个响应缓慢的网站. 一个打开缓慢的网站会导致严重的用户流失, 很多时候网站性能问题是网站架构升级优化的触发器. 可以说性能是网站架构设计的一个重要方面, 任何软件架构设计方案都必须考虑可能会带来的性能问题.
也正是因为性能问题几乎无处不在, 所以优化网站性能的手段也非常多, 从用户浏览器到数据库, 影响用户请求的所有环节都可以进行性能优化.
在浏览器端:
可以通过浏览器缓存, 使用页面压缩, 合理分布页面, 减少 Cookie 传输等改善性能.
还可以使用 CDN, 将网站静态内容分发至离用户最近的网络服务商机房, 使用户通过最短访问路径获取数据.
可以在网站机房部署反向代理服务器, 缓存热点文件, 加快请求响应速度, 减轻应用服务器负载压力.(Nigix).
在应用服务器端:
可以使用服务器本地缓存和分布式缓存, 通过缓存在内存中的热点数据处理用户请求, 加快请求处理过程, 减轻数据库负载压力.(Redis, Memecache, JBoss Cache, Ehcache)
也可以通过异步操作将用户请求发送至消息队列等待后续任务处理, 而当前请求直接返回给用户.(RabbitMq, Kafka)
在网站有很多用户高并发请求的情况下, 可以将多台应用服务器组成一个集群共同对外服务, 提高整体处理能力, 改善性能.
在代码层面:
也可以通过使用多线程, 改善内存管理等手段优化性能.
在数据库服务器端:
索引, 缓存, SQL 优化等性能优化手段都已经比较成熟. 而方兴未艾的 NoSQL 数据库通过优化数据模型, 存储结构, 伸缩特性等手段在性能方面的优势也日趋明显.(MongoDB, HBase).
衡量网站性能有一系列指标, 重要的有响应时间, TPS, 系统性能计数器等, 通过测试这些指标以确定系统设计是否达到目标. 这些指标也是网站监控的重要参数, 通过监控这些指标可以分析系统瓶颈, 预测网站容量, 并对异常指标进行报警, 保障系统可用性.
对于网站而言, 性能符合预期仅仅是必要条件, 因为无法预知网站可能会面临的访问压力, 所以必须要考察系统在高并发访问情况下, 超出负债设计能力的情况下可能会出现的性能问题. 网站需要长时间持续运行, 还必须保证系统在持久运行且访问压力不均匀的情况下保持稳定的性能特性.
性能测试指标
响应时间
并发数
吞吐量
性能计数器
性能测试方法
性能测试是一个不断对系统增加访问压力, 以获得系统性能指标, 最大负载能力, 最大压力承受能力的过程.
性能测试: 以系统设计初期规划的性能指标为预期目标, 对系统不断施加压力, 验证系统在资源可接受范围内, 是否能达到性能预期.
负载测试 : 对系统不断地增加并发请求以增加系统压力, 知道系统的某项或多项性能指标达到安全临界值, 如某种资源已经呈饱和状态, 这是继续对系统施加压力, 系统的处理能力不但不提高, 反而会下降.
压力测试 超过安全负载的情况下, 对系统继续施加压力, 知道系统崩溃或不能再处理请求, 一次获得系统最大压力承受能力.
稳定性测试 : 被测试系统在特定硬件, 软件, 网络环境条件下, 给系统加载一定业务压力, 使系统运行一段较长时间, 以此检测系统是否稳定. 在不同生成环境, 不同时间点的请求压力是不均匀的, 呈波浪特性, 因此为了更好地模拟生产环境, 稳定性测试也不应均与地对系统施加压力.
性能优化
根据网站分层架构, 性能优化可分为: web 前端性能优化, 应用服务器性能优化, 存储服务器性能优化.
web 前端性能优化
浏览器访问优化: 减少 http 请求; 使用浏览器缓存; 启用压缩; CSS 放在页面最上面, javaScript 放在页面最下面; 减少 Cookie 传输
CDN 加速
反向代理
应用服务器性能优化
分布式缓存 (Redis 等)
异步操作 (消息队列)
使用集群 (负载均衡)
代码优化
存储性能优化
机械硬盘 vs 固态硬盘
B + 树 vs LSM 树
RAID vs HDFS
代码优化
多线程 (Q: 怎么确保线程安全? 无锁机制有哪些?)
资源复用 (单例模式, 连接池, 线程池)
数据结构
垃圾回收
多线程三大定律
Amdahl 定律
Gene Amdahl 发现在计算机体系架构设计过程中, 某个部件的优化对整个架构的优化和改善是有上限的. 这个发现后来成为知名的 Amdahl 定律.
比如: 即使你有 10 个老婆, 也不能一个月把孩子生下来.
Gustafson 定律
Gustafson 假设随着处理器个数的增加, 并行与串行的计算总量也是可以增加的. Gustafson 定律认为加速系数几乎跟处理器个数成正比, 如果现实情况符合 Gustafson 定律的假设前提的话, 那么软件的性能将可以随着处理个数的增加而增加.
比如: 当你有 10 个老婆, 就会要生更多的孩子.
Sun-Ni 定律
充分利用存储空间等计算资源, 尽量增大问题规模以产生更好 / 更精确的解.
比如: 你要设法让每个老婆都在干活, 别让她们闲着.
来源: https://juejin.im/entry/5b3c9eb3e51d4519610db547