性能优化 - 性能测试, 系统优化, 锁
性能测试:
性能测试是性能优化的前提和基础,也是性能优化结果的检查和度量标准。
性能测试指标:
响应时间:指应用系统从发出请求开始到收到最后响应数据所需要的时间;
并发数:系统能够同时处理请求的数目;
吞吐量: 指单位时间内系统处理的请求的数量;
性能计数器: 是描述服务器或操作系统性能的一些数据指标
性能测试方法:
性能测试: 以系统预期性能指标为预期目标, 不断施压验证系统性能指标.
负载测试: 不断增加系统压力, 道道安全临界值
压力测试: 超过负载的测试,知道系统无法处理
稳定性测试: 在恒定的业务压力下使得系统运行较长时间
全链路测试
全链路压测其实指的就是在特定的业务场景下,将相关的链路完整的串联起来同时施压, 尽可能模拟出真实的用户行为. 暴露出系统的问题.
数据构造:
线上数据筛选,脱敏,ID 隔离,订正做为压测基础数据, 压测是对数据进行预测,按比例方法, 构造压测数据集合
数据隔离:
逻辑隔离: 生产环境打标, 需要进行数据清理
虚拟隔离: 写入 MOCK 端, 不影响生产环境,测试不准确.
物理隔离: 写入指定物理设备, 单独的压测环境
流量构造:
以天猫为例, master+slave 结构, master 作为压测管控台管理着上千 个 slave 节点;slave 节点作为压测 引擎,负责具体的请求发送。其中 Slave 部署在全球各地的 CDN 节点上. 模拟全球用户发送的请求.
全链路压测平台化:
使得全链路压测常态化.
性能优化
原则
不能优化一个没有测试的软件
不能优化一个你不了解的软件
性能优化方法
性能测试 获得性能指标
指标分析 发现瓶颈点
架构和代码分析 寻找瓶颈点
架构代码优化,优化关键技术点,平衡资源
再进行性能测试
分层思想
机房与骨干网络性能优化
服务器与硬件性能优化
操作系统性能优化
虚拟机性能优化
基础组件性能优化
软件架构性能优化
软件代码性能优化
软件架构性能优化
缓存
异步
集群
代码性能优化
并发编程,对线程与锁
资源复用,线程池与对象池
异步编程,生产者消费者
数据结构,数组,链表,hash 表,树
操作系统优化
多任务环境
进程分时执行, 运行状态分为:运行, 就绪,阻塞
进程 VS 线程
进程间 CPU 切换,代价非常大, 因此服务器通常是单进程多线程, 线程共享进程资源. 线程通过线程栈保存各自状态信息.
线程安全
多线程访问共享资源的代码称为临界区,解决线程安全是使用锁
避免阻塞引起的崩溃
限流:控制接入请求数
降级:关闭部分程序
反应式: 异步
锁
锁原语 CAS
CAS(V,E,N)
V 要更新的变量
E 预期值
N 新值
原语的执行必须是连续的. 执行过程中不能中断
Java 使用锁
偏向锁: 指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁
轻量级锁: 当被其他进行访问升级为轻量级锁
重量级锁: 进入阻塞状态,膨胀为重量级锁 .
多 CPU 下的锁
总线锁: 使用处理器 LOCK#信号,在总线上发送此信号,其他处理器被阻塞
缓存锁: 允许它的缓存一致性机制来保证操作的原子性,
公平锁: 按顺序
非公平锁: 有优先级
可重入锁: 可以再次获取而不被死锁
独享锁/互斥锁: 只能被一个线程使用
共享锁: 可以被多个线程持有
读写锁:多个读线程之前并不互斥,写线程互斥
乐观锁:在更新数据的时候,检查是否已经被修改过,如果修改过,就放弃
悲观锁: 对于同一个数据的并发操作,悲观锁采取加锁的形式。
分段锁:是细化锁的粒度, 仅仅针对数 组的一段进行加锁操作. JDK ConcurrentHashMap 是
自旋锁: 指尝试获取锁的线程不会立即阻塞
案例 异步并发分布式编程框架 akka
使用 Actor 模型
异步非阻塞
支持 Local 和 Remote 模式
树状结构,上级可以处理下级异常
通过 Router Actor 集群模式
异常交给父类处理
参考及引用
架构师训练营作业-李智慧老师相关讲义
Photo by Umberto Shaw from Pexels
评论