架构师训练营 第 7 周总结
本周主要学习了以下内容
介绍系统性能的相关指标及如何进行性能测试
性能优化的思想、方法、套路
操作系统的多任务环境以及锁的机制
文件与硬盘 IO
系统性能指标
响应时间是衡量系统性能的最主要指标,因为它直接反应系统的“快慢”;
并发数(TPS/QPS)是系统能同时处理任务数量的能力,较能反应系统的性能;
并发数与响应时间,决定了性能的吞吐量,即单位时间内所能完成的任务
吞吐量=(1000 / 响应时间 ms)* 并发数
性能测试
性能测试可细分为:性能测试、负载测试、压力测试、稳定性测试;
性能测试:验证系统是否达到并发、响应时间、吞吐量等要求;
负载测试:找出系统的安全临界点,在该点前增加压力,系统的性能稳定,吞吐量不断提升,过了该点系统性能明显下降,吞吐量增速明显放缓,响应时间明显变慢,处理能力变差;
压力测试:超过安全临界点继续增压,直到系统崩溃,以此获得系统的最大负载能力;
稳定性测试:模拟生产环境的资源、压力波动的情况,持续运行系统;
下图可以直观说明上述文字描述的情况:
另外,还有全链路的压测,它需要串联起整个系统,测试完整的流程,这时候需要解决的是大量数据的构造模拟、数据的隔离等问题。
性能优化的思想
原则
不能优化一个没有经过测试的软件
不能优化一个你不了解的软件
总的来说,要先用性能测试了解软件,才能谈优化,特别是面对新技术,不能一上来就说系统没有用新技术,用了它就能提升性能。一切都需要有数据作为依据,优化前是了解性能差在哪里,优化后是通过它知道优化的效果怎样,这是衡量工作成果的指标。
套路
性能测试,获得系统指标
根据指标分析系统瓶颈
分析架构、代码,找出瓶颈原因
架构、代码优化
性能测试,进入闭环
分层的优化思想
网络:异地多活、CDN;
服务器、硬件:性能更好的硬件、性能更好的机器;
操作系统:操作系统对于硬件的控制机制;
虚拟机:对内存回收、多线程的管理机制;
基础组件:换用性能更优的组件;
架构
代码
架构优化的三板斧头
优化的套路离不开这三个:
缓存:最重要的优化方法,从更快速的介质上操作数据或直接减少重复的计算或减少慢介质的操作量,主要优化读操作;
异步:更快速的调用响应,用消息队列控制消费速度,平衡负载压力,主要优化写操作;
集群:分布式多台服务器共同完成之前单机的任务,横向扩展提升系统性能;
代码
使用面向对象的设计模式与方法,使用更多合适的编程技巧:
并发编程,多线程和锁的使用;
资源复用,线程池、对象池的使用;
异步编程,消息队列、生产者、消费者模式;
数据结构:树、队列、数组、hash 表、链表;
操作系统
进程的形象理解:程序的静态的,在操作系统运行时,它是活起来的,拥有各种附属的数据和状态,被称为进程。
操作多任务原理:进程分时执行,CPU 在任务间不断切换,因为切换速度很快,所以用户看起来就像是任务在同时处理。
多进程、多线程
线程与进程:前者的任务切换代价比后者要小;
多线程:由一个父进程创建的线程,线程间共享进程的堆内存;因为堆内存共享,所以可能存储同时更新同一个内存的情况,导致线程安全问题;
临界区:操作共享内存的代码,一般使用锁机制解决线程安全问题;
高并发的阻塞问题:锁会被资源被占用无法释放,量过大导致资源耗尽,最终系统崩溃;
解决高并发阻塞问题:限流、降级、异步;
锁
虽然锁会有高并发阻塞问题,但在传统多进程/线程同步编程模式,锁是十分常见的,需要掌握它的使用场景,在适合的情况下使用锁。
锁原语 CAS:
V 表示要更新的值
E 表示预期的值
N 表示新值
如果 V 和 E 相同,则 V 设为 N,否则什么也不做。
各种锁
java 中,单个线程利用偏向锁自动获取锁,多线程时则转为轻量级锁,线程自旋竞争锁,若自旋次数超限,则膨胀为重量级锁,竞争期间会阻塞线程;
总线锁、缓存锁:适用多 CPU 共享内存,总结锁只允许其中一个 CPU 处理内存,同时会阻塞其它 CPU;缓存锁利用缓存一致性保证操作的原子性,防止同一内存区域被多个处理器使用;
公平锁、非公平锁:加锁过程是否条件一致;
可重入锁:已获得锁的线程能再次获取得到,防止死锁;
独享、互斥、共享锁:能否同时被多个线程所持有;
读写锁:读一般不加锁,写要加;
乐观锁、悲观锁:乐观锁认为数据一般不会被同时修改,要是遇到冲突则重试;悲观锁认为数据经常会被并发操作,每次都需要加锁再执行更新;前者适用于少写场景,后者适用于多写场景;
分段锁:对操作进行细化后,针对性加锁;
文件与 IO
硬件 IO
性能从高到低: CPU 缓存 > 内存 > 固态硬盘 > 机械硬盘
数据库 IO 优化
B+树:多叉树,每个节点存储更多的数据,避免分支层级的跳转,因为跳转会导致机械硬盘切换盘面,切换的耗时较大,会影响读写性能
LSM 树:对硬盘进行顺序写,解决随机写数据性能低的问题;
文件系统
linux inode: 操作系统将文件拆分为多个固定大小的文件控制块,用 inode 记录文件包含哪些文件控制块,但因为单个文件的 inode 大小有限制,所以单个文件的大小也有限制;
分布式文件系统:将文件拆分成固定大小的数据块,不受操作系统的文件大小限制,适用存储海量数据、大文件,典型应用 HDFS;
总结
总的来说,架构师首先要先有发现问题的能力或经验,懂得性能优化需要先进行性能测试分析,这时就可以利用性能测试工具获得整个系统的各种性能指标,分析也系统的瓶颈点,这时需要对硬件、操作系统、虚拟机、文件系统等底层原理有一定的了解,知道它们可能会造成什么影响,并用优化的分层思想逐层剖析,最终用最简单的方法解决性能瓶颈。
评论