Bootstrap

架构训练营-week7-学习总结-性能测试,操作系统,锁

性能测试

性能测试是性能优化的前提和基础,也是性能优化结果的检查和度量标准。

不同视角下:

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

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

性能测试指标

主要指标:

  • 响应时间

  • 并发数

  • 吞吐量

  • 性能计数器等。

重点内容:响应时间、并发数、吞吐量的关系

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

注意不同阶段的响应时间、并发数、吞吐量是如何变化、原因。

个人理解如下:

随着并发压力增加,吞吐量会先升高,达到峰值后会逐步降低,如果负载过高可能导致系统崩溃、那此时的吞吐量就会是0。相应的,根据上面公式可以看出,吞吐量一定的时候,并发数增加,分给单个线程的资源变少,会导致系统响应时间变长,如果并发过高、系统崩溃,那此时的响应时间就是无限了~.~

原因:

  • 在并发数较低时,系统负载能力要高于当前并发数量,资源比较充足,此时并发数逐渐增加,系统仍能迅速处理,因而吞吐量会逐步增大,此时响应时间不会有太大变化,但由于资源逐步紧缺,响应时间会有缓慢增加的趋势;

  • 当并发数到达一定数量、超过系统负载能力,此时系统吞吐量到达最大值,并发数继续增大时,吞吐量不会有明显变化,但响应时间开始明显增加;

  • 一旦并发数超过某个阈值,将导致系统崩溃,无法及时处理用户请求,导致服务雪崩,性能急剧下降,吞吐量下降,响应时间快速上升。

####

性能测试方法

具体可细分为:

  • 性能测试

  • 负载测试

  • 压力测试

  • 稳定性测试

全链路压测

全链路压测其实指的就是在特定的业务场景下,将相关的链路完整的串联起来同时施压,尽可能模拟出真实的用户行为,当系统整站流量都被打上来的时候,必定会暴露出性能瓶颈,才能够探测出系统整体的真实处理能力,以及有指导的在大促前进行容量规划和性能优化,这便是线上实施全链路压测的真正目的。

全链路压测的挑战

  • 数据构造:压测数据怎么构造?如何确保压测流量能走完所有流程、没有死角?

  • 数据隔离:在线上真实环境模拟时,如何确保对线上无影响?

  • 流量构造:如何模拟线上请求?大促所带来的巨大流量怎样制作出来?

数据构造

个人理解:

  • 线上用户数据记录日志,日志导出,经过筛选、脱敏等步骤,作为压测基础数据,然后结合BI提供的数据,通过数据构造平台生成压测数据,然后流量平台读取这些压测数据,生成相应的模拟请求。

数据隔离

  • 逻辑隔离

  • 虚拟隔离

  • 物理隔离

流量构造

示例:天猫双十一全链路压测的流量平台

  • master+slave 结构

  • master:负责的整个平台的运转控制、命令发送、数据收集、决策等。

  • slave:部署在全球各地的 cdn 节点上,从而模拟从全球各地过来的用户请求。

性能优化

两个基本原则

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

  • 你不能优化一个你不了解的软件

性能测试主要指标

  • 响应时间

  • 并发数

  • 吞吐量

  • 性能计数器

性能优化的一般方法

  • 性能测试,获得性能指标

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

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

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

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

系统性能优化的分层思想

  • 机房与骨干网络性能优化

  • 服务器与硬件性能优化

  • 操作系统性能优化

  • 虚拟机性能优化

  • 基础组件性能优化

  • 软件架构性能优化

  • 软件代码性能优化

操作系统

CPU核数有限,如何支持并发处理多任务?

进程分时执行,CPU时间片

进程的运行期状态

  • 运行

  • 就绪

  • 阻塞

进程与线程

太简单了,此处掠过。

线程栈

此处实际上说的是基于栈的计算模型,JVM内部就是这样。

线程安全

临界区

阻塞导致高并发系统崩溃

阻塞导致线程既不能继续执行,也不能释放资源。进而导致资源耗尽。最终导致系统崩溃。

此处可以延伸的知识:分布式系统中:服务超时可能导致服务雪崩。

避免服务雪崩:熔断、降级、限流

线上可选用的框架:Hystrix, Sentinel

避免阻塞引起的崩溃

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

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

  • 反应式:异步;无临界区(Actor 模型)

CAS

CAS 是一种系统原语,原语的执行必须是连续的,在执行过程中不允许被中断

Java通过CAS原语在对象头中修改Mark Word实现加锁。

偏向锁 轻量级锁 重量级锁

  • 偏向锁:指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,降低获取锁的代价

  • 轻量级锁:指当锁是偏向锁时,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能

  • 重量级锁:指当锁是轻量级锁时,另一个线程虽然自旋,但自旋不会一直持续下去,当自旋到一定次数时,还没获取到锁,就会进入阻塞,该锁膨胀为重量级锁,重量级锁会让其他申请的线程进入阻塞,性能降低

延伸知识

硬件层面是通过缓存一致性协议、或是总线锁机制来实现锁。

各种锁

  • 公平锁与非公平锁

  • 可重入锁

  • 独享锁/互斥锁/排它锁:一次只能被一个线程持有 共享锁:可以被多个线程持有

  • 读写锁

  • 乐观锁与悲观锁

  • 分段锁

  • 自旋锁