第七周总结
性能测试
性能测试是性能优化的前提和基础,也是性能优化结果的检测和度量标准。不同视角下网站性能有不同的标准,也有不同的优化手段。
主观视角:用户感受到的性能
客观视角:性能指标衡量的性能
性能测试指标
响应时间、并发数、吞吐量、性能计数器
响应时间
指应用系统发出请求开始到收到最后响应数据所需要的时间。响应时间是系统最重要的性能指标,直接反应了系统的‘快慢’
并发数
系统能够同时处理请求的数目。这个数字也反映了系统的负载特性,对网站而言,并发数即系统并发用户数。
吞吐量
指单位时间内系统处理的请求的数量,体现了系统的处理能力,请求数/秒|天|小时
TPS 每秒处理事务数
QPS 每秒查询数
HPS 每秒http请求数
吞吐量=(1000/响应时间ms)*并发数
性能计数器
是指描述服务器或操作系统性能的一些数据指标。如
负载 (load)、对象与线程数、内存使用、CPU使用、磁盘与网络的I/O指标等
性能测试的方法
性能、负载、压力、稳定性测试等
性能测试
以系统设计初期规划的性能指标为预期目标,对系统不断施加压力,验证系统在资源可接受的范围内,是否能达到性能预期。
负载测试
对系统不断增加并发请求以增加系统压力,知道系统的某项或多项性能指标达到安全临界值,如果某种资源已呈现饱和状态,这时候继续对系统增加压力,系统地处理能力不但不提高,反而下降。
压力测试
超过安全负载的情况下,对系统继续施加压力,直到系统崩溃或不能再处理任何请求,以此获得系统最大压力承受能力
稳定性测试
被测系统在一定条件下,给系统一定的业务压力,使其运行一段较长时间,以此检测系统是否稳定。
全链路压测
全链路压测其实指的就是在特定的业务场景下,将相关的链路完整的串联起来同时施压,尽可能模拟出真实的用户行为,在整站流量大增时,找出性能瓶颈,并有针对性的性能优化即扩容。
数据隔离
逻辑隔离:直接把测试数据和正常数据写在一起,通过特殊标识能够区分开,可能污染线上数据,破坏安全性
虚拟隔离:在所有写数据的地方mock,不真的写,不污染线上数据,但可能会对压测准确性有影响
物理隔离:所有写数据地方对压测流量进行识别,判断一旦是压测流量的写,就写到隔离位置,如存储、缓存、搜索引擎等
性能优化两个原则
不能优化没有测试的软件
不能优化不了解的软件
性能优化的一般方法
性能测试,获得指标
指标分析,发现性能与资源瓶颈点
架构与代码分析,寻找性能与资源瓶颈关键所在
架构与代码优化,优化关键技术点,平衡资源利用
性能测试,进入性能优化闭环
系统性能优化的分层思想
机房与骨干网络优化
服务器与硬件性能优化
操作系统性能优化
虚拟机性能优化
基础组件性能优化
软件架构性能优化
软件代码性能优化
性能优化三板斧
缓存
异步
集群
软件代码性能优化
遵循面向对象的设计原则与设计模式编程,很多时候不是挑战高,而是代码烂(太对了)
并发编程,多线程与锁
资源复用,池化
异步编程,生产消费者
数据结构,数组、链表、hash 表、树
操作系统
进程状态
运行
就绪
阻塞
进程VS线程
进程重,线程轻
线程栈
栈帧,后进先出
避免阻塞引起的崩溃
限流:控制计算机的请求数,进而减少创建的线程数
降级:关闭部分功能程序的执行,尽早释放线程
避免阻塞:异步I/O,无临界区(Actor)
锁
锁原语CAS
CAS是系统原语,原语的执行必须是连续的(原子),在执行过程中不允许中断
偏向锁、轻量锁、重量锁
由轻到重:
偏向->轻量->重量
机制:
单线程时,该线程自动获取偏向锁
多线程成,变为轻量锁,自旋,CAS,非公平锁
轻量锁自旋一定次数后变为重量锁,开始阻塞。
多CPU下的锁
缓存一致协议或总线锁
总线锁与缓存锁
总线锁:使用处理器的LOCK#信号,当一个处理器在内存总线上输出此信号时,其它处理器的请求会被阻塞,该处理器独占内存
缓存锁:处理器改内部缓存,并回写主存,并通知其它处理器内部缓存失效
公平锁、非公平锁
就是排不排队的区别
可重入锁
独享锁、互斥锁、共享锁、读写锁
独享/互斥锁:只能被一个线程持有
共享锁:可被多线程持有
读写锁:读读不互斥,读写互斥
乐观锁、悲观锁
乐观锁:干了再说,不行回退,CAS。
悲观锁:先上锁,踏踏实实干
分段锁
就是大锁变小锁的过程
自旋锁
就是while(true),用cpu来减少上下文切换消耗。
评论