性能优化 - 学习总结笔记
性能测试
性能测试是新能优化的前端和基础
主观视角:用户感受到的性能
客观视角:性能指标衡量性能
性能测试指标:
相应时间:完成一次任务花费的时间
并发数:同时处理的任务数:
吞吐量:单位时间完成的任务数
性能计数器:System Load,线程数,进程数,CPU,内存,磁盘,网络使用率
TPS: 每秒事务数
HPS:每秒HTTP请求数
QPS: 每秒查询数
性能测试方法:
性能测试:以系统设计初期规划的性能指标为预期目标,对系统不断施加压力,验证系统在资源可接受范围内,是否能达到性能预期
负载测试:测试系统性能指标的安全临界值(继续施压系统的TPS会下降)
压力测试:测试系统最大承受能力
稳定性测试:加长时间压测,以检测系统是否稳定
全链路压测
全链路压测挑战
压测数据如何构建
真实环境模拟,如何保证对线上无影响
巨大流量是怎么样来
数据构建
Dump 真实用户数据
筛选,脱敏,订正
增量放大请求
数据隔离
逻辑隔离:直接把测试数据和正常数据写到一起,通过特殊标识区分,
逻辑出现问题,可能污染线上数据
虚拟隔离:在所有写数据的地方做mock,并不真正的写进去
Mock 对压测结果的准确性会产生干扰
物理隔离:所有写数据的地方对压测流量进行识别,判断一旦是压测流量的写,就写到隔离位置,包括存储,缓存,搜索引擎等等
流量构造
天猫通过CDN服务器构造压测流量
性能优化
两个基本原则:
你不能优化一个没有测试的软件
你不能优化一个你不了解的软件
性能优化的一般方法
性能测试,获得性能指标
指标分析,发现性能与资源瓶颈点
架构与代码分析,寻找性能与资源瓶颈关键所在
架构与代码及其他优化,优化关键技术点,平衡资源利用
性能测试,进入性能优化闭环
系统性能优化的分层思想
机房与骨干网络性能优化
服务器与硬件性能优化
操作系统性能优化
虚拟机性能优化
基础组件性能优化
软件架构性能优化
软件代码性能优化
程序运行时架构
程序是静态的
程序运行起来以后,被称为进程
计算机CPU核心数有限,但是服务器可以同时处理数以百计至数以千计的并发用户请求
进程分时执行
进程的运行状态
运行
就绪
阻塞
避免阻塞引起的崩溃
限流
降级
反应式:异步,无临界区
锁
偏向锁:指一段同步代码一致被一个线程所访问,那么该线程会自动获取锁,降低获取锁的代价
轻量级锁:指当偏向锁时,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能
重量级锁:指当锁是轻量级锁时,另一个线程虽然自旋,但自旋不会一直持续下去,当自旋到一定此时时,还没获取到锁,就会进入阻塞,该锁膨胀为重量级锁,重量级锁会让其他申请的线程进入阻塞,性能降低
总线锁:使用处理器的LOCK# 信号,当一个处理器在内存总线上输出此信号的时候,其他处理器的请求将被阻塞,该处理器独占内存
缓存锁: 是指内存区域如果被缓存在处理器的缓存中,并且在Lock操作期间被锁定,那么当它执行锁操作回写到内存时,处理器不在总线上声言LOCK# 信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改由两个以上处理器存的内存区域数据,当其他处理器回写已被锁定的缓存行数据时,会使缓存无效。
公平锁:多个线程按照申请锁的顺序来获取锁
非公平锁:多个线程获取锁的顺序不是按照申请锁的顺序,有可能是申请线程比先申请的线程优先获取锁,可能会造成饥饿现象
独享锁/互斥锁:该锁一次只能被一个线程所持有
共享锁:该锁可以被多个线程所持有
读写锁:多个对线程之间并不互斥,而写线程则要求与任何线程互斥
悲观锁:认为同一个数据的并发操作,一定是会发生修改的。悲观锁采用加锁的形式
乐观锁:认为同一个数据并发操作,是不会发生修改的。更新数据时候,检查是否已经被修改过,如果修改过,就丢弃该次操作
分段锁:是细化锁的粒度,当操作不需要更新整个数组的时候,就仅仅针对数组的一段进行加锁操作
自旋锁:尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU
文件系统和磁盘I/O
尽量用顺序读写
机械硬盘
固态硬盘
RAID 独立硬盘冗余阵列
RAID 0
RAID 1
RAID 10
RAID 5 最常见
RAID 6
分布式文件系统 HDFS
数据结构和算法
时间复杂度:算法执行语句的次数
空间负载度: 一个算法在运行
评论