写点什么

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

用户头像
于成龙
关注
发布于: 2020 年 11 月 04 日
架构训练营-week7-学习总结-性能测试,操作系统,锁

性能测试



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



不同视角下:



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

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



性能测试指标



主要指标:



  • 响应时间

  • 并发数

  • 吞吐量

  • 性能计数器等。



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



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





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



个人理解如下:

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



原因:

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

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

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



####



性能测试方法



具体可细分为:



  • 性能测试

  • 负载测试

  • 压力测试

  • 稳定性测试







全链路压测



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



全链路压测的挑战



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

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

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



数据构造



个人理解:



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





数据隔离



  • 逻辑隔离

  • 虚拟隔离

  • 物理隔离



流量构造



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



  • master+slave 结构

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

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



性能优化



两个基本原则



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

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



性能测试主要指标



  • 响应时间

  • 并发数

  • 吞吐量

  • 性能计数器



性能优化的一般方法



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

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

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

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

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



系统性能优化的分层思想



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

  • 服务器与硬件性能优化

  • 操作系统性能优化

  • 虚拟机性能优化

  • 基础组件性能优化

  • 软件架构性能优化

  • 软件代码性能优化



操作系统



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



进程分时执行,CPU时间片



进程的运行期状态



  • 运行

  • 就绪

  • 阻塞



进程与线程



太简单了,此处掠过。



线程栈



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



线程安全



临界区



阻塞导致高并发系统崩溃



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



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



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



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



避免阻塞引起的崩溃



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

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

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





CAS



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



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



偏向锁 轻量级锁 重量级锁



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

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

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



延伸知识



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



各种锁



  • 公平锁与非公平锁

  • 可重入锁

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

  • 读写锁

  • 乐观锁与悲观锁

  • 分段锁

  • 自旋锁



发布于: 2020 年 11 月 04 日阅读数: 61
用户头像

于成龙

关注

还未添加个人签名 2012.09.13 加入

还未添加个人简介

评论

发布
暂无评论
架构训练营-week7-学习总结-性能测试,操作系统,锁