第七周总结

用户头像
秦宝齐
关注
发布于: 2020 年 07 月 22 日

性能测试

性能测试是性能优化的前提和基础,也是性能优化结果的检测和度量标准。不同视角下网站性能有不同的标准,也有不同的优化手段。



主观视角:用户感受到的性能

客观视角:性能指标衡量的性能



性能测试指标



响应时间、并发数、吞吐量、性能计数器



响应时间

指应用系统发出请求开始到收到最后响应数据所需要的时间。响应时间是系统最重要的性能指标,直接反应了系统的‘快慢’



并发数

系统能够同时处理请求的数目。这个数字也反映了系统的负载特性,对网站而言,并发数即系统并发用户数。



吞吐量

指单位时间内系统处理的请求的数量,体现了系统的处理能力,请求数/秒|天|小时



TPS 每秒处理事务数

QPS 每秒查询数

HPS 每秒http请求数



吞吐量=(1000/响应时间ms)*并发数



性能计数器

是指描述服务器或操作系统性能的一些数据指标。如

负载 (load)、对象与线程数、内存使用、CPU使用、磁盘与网络的I/O指标等



性能测试的方法

性能、负载、压力、稳定性测试等



性能测试

以系统设计初期规划的性能指标为预期目标,对系统不断施加压力,验证系统在资源可接受的范围内,是否能达到性能预期。



负载测试

对系统不断增加并发请求以增加系统压力,知道系统的某项或多项性能指标达到安全临界值,如果某种资源已呈现饱和状态,这时候继续对系统增加压力,系统地处理能力不但不提高,反而下降。



压力测试

超过安全负载的情况下,对系统继续施加压力,直到系统崩溃或不能再处理任何请求,以此获得系统最大压力承受能力



稳定性测试

被测系统在一定条件下,给系统一定的业务压力,使其运行一段较长时间,以此检测系统是否稳定。



全链路压测

全链路压测其实指的就是在特定的业务场景下,将相关的链路完整的串联起来同时施压,尽可能模拟出真实的用户行为,在整站流量大增时,找出性能瓶颈,并有针对性的性能优化即扩容。

数据隔离

  1. 逻辑隔离:直接把测试数据和正常数据写在一起,通过特殊标识能够区分开,可能污染线上数据,破坏安全性

  2. 虚拟隔离:在所有写数据的地方mock,不真的写,不污染线上数据,但可能会对压测准确性有影响

  3. 物理隔离:所有写数据地方对压测流量进行识别,判断一旦是压测流量的写,就写到隔离位置,如存储、缓存、搜索引擎等

性能优化两个原则

  • 不能优化没有测试的软件

  • 不能优化不了解的软件

性能优化的一般方法

  • 性能测试,获得指标

  • 指标分析,发现性能与资源瓶颈点

  • 架构与代码分析,寻找性能与资源瓶颈关键所在

  • 架构与代码优化,优化关键技术点,平衡资源利用

  • 性能测试,进入性能优化闭环

系统性能优化的分层思想

  • 机房与骨干网络优化

  • 服务器与硬件性能优化

  • 操作系统性能优化

  • 虚拟机性能优化

  • 基础组件性能优化

  • 软件架构性能优化

  • 软件代码性能优化

性能优化三板斧

  • 缓存

  • 异步

  • 集群

软件代码性能优化

遵循面向对象的设计原则与设计模式编程,很多时候不是挑战高,而是代码烂(太对了)

并发编程,多线程与锁

资源复用,池化

异步编程,生产消费者

数据结构,数组、链表、hash 表、树

操作系统

进程状态

  • 运行

  • 就绪

  • 阻塞

进程VS线程

进程重,线程轻

线程栈

栈帧,后进先出



避免阻塞引起的崩溃

限流:控制计算机的请求数,进而减少创建的线程数

降级:关闭部分功能程序的执行,尽早释放线程

避免阻塞:异步I/O,无临界区(Actor)

锁原语CAS

CAS是系统原语,原语的执行必须是连续的(原子),在执行过程中不允许中断



偏向锁、轻量锁、重量锁

由轻到重:

偏向->轻量->重量



机制:

单线程时,该线程自动获取偏向锁

多线程成,变为轻量锁,自旋,CAS,非公平锁

轻量锁自旋一定次数后变为重量锁,开始阻塞。



多CPU下的锁

缓存一致协议或总线锁



总线锁与缓存锁

总线锁:使用处理器的LOCK#信号,当一个处理器在内存总线上输出此信号时,其它处理器的请求会被阻塞,该处理器独占内存

缓存锁:处理器改内部缓存,并回写主存,并通知其它处理器内部缓存失效



公平锁、非公平锁



就是排不排队的区别

可重入锁

独享锁、互斥锁、共享锁、读写锁



独享/互斥锁:只能被一个线程持有

共享锁:可被多线程持有

读写锁:读读不互斥,读写互斥



乐观锁、悲观锁

乐观锁:干了再说,不行回退,CAS。

悲观锁:先上锁,踏踏实实干



分段锁

就是大锁变小锁的过程



自旋锁

就是while(true),用cpu来减少上下文切换消耗。



用户头像

秦宝齐

关注

还未添加个人签名 2020.03.26 加入

还未添加个人简介

评论

发布
暂无评论
第七周总结