架构师训练营第七周 - 总结

用户头像
草原上的奔跑
关注
发布于: 2020 年 07 月 21 日
架构师训练营第七周-总结

本周主要讲了性能优化,以及操作系统文件系统



性能优化

做性能优化,首先要对性能有一个量化的描述,通过优化前后的性能测试数据,判断性能优化的成果。

什么是性能

性能,从主观上来说就是用户感受到的打开页面的速度。比如,打开页面100ms以内,用户感觉不到页面加载停顿,会觉得网站访问还是挺快的。

从客观上来说,能用来度量性能的指标有
  • 响应时间

  • 并发数

  • 吞吐量

  • 性能计数器

  • System load

  • 对象与线程数

  • 内存使用

  • CPU使用

  • 磁盘与网络IO

如何做性能测试

性能测试是一个总称,具体分为:

  1. 性能测试

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

  1. 负载测试

在性能测试的基础上,继续对系统增加并发访问数,直到系统的某项或多项性能指标达到安全临界值,如某种资源已经呈饱和状态,这时候继续对系统施加压力,系统的处理能力不但不能提高,反而下降

  1. 压力测试

安全负载的情况下,继续对系统增加并发访问数,直到系统崩溃或者不能再处理任何请求,以此获得系统最大压力承受能力

  1. 稳定性测试

被测试系统在特定的硬件、软件、网络环境条件下,给系统加载一定的业务压力,使系统运行一段较长时间,以此检测系统是否稳定。生产环境,系统请求是不均匀的,呈波浪特性,因此为了更好的模拟生产环境,稳定性测试也应不均匀地对系统施加压力。

做完整的性能测试就是做不断的增加系统并发请求数,判断在这些并发请求数的情况下,系统吞吐量和响应时间的变化情况。

稳定性测试和前三种不同,稳定性测试需要周期性的增大减小单位时间并发数。

软件性能优化的两个基本原则

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

  • 不要优化不了解的软件

性能优化的一般流程

  1. 性能测试,获得性能指标

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

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

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

  5. 性能测试,进入性能优化闭环

性能优化的七层模型

  1. 机房与骨干网络性能优化

  2. 服务器与硬件性能优化

  3. 操作系统性能优化

  4. 虚拟机性能优化

  5. 基础组件性能优化

  6. 软件架构性能优化

  7. 软件代码性能优化

以上7层,从上到下进行瓶颈点的分析,排查。最后才是架构和代码的优化。

以第5层,基础组件优化来说,阿里的基础组件jboss4.0.5+mod_jk+apache2.0.61+dbcp1.2.2组合更改为jetty7.1.5+mod_proxy+apache2.2.15+dbcp1.4,并发数未变的情况下,TPS变为原来的4倍。性能大幅度提升,阿里巴巴全站下线1/3应用服务器,来年不用采购新机器。架构更简单,配置更轻量。应用无需变化,开发和维护的福音。

性能优化三板斧

  • 缓存

提高读的性能

  • 异步

提高写的性能

  • 集群

通过增加服务器,提高系统存储和计算能力

代码的优化

  • 并发编程,多线程与锁优化

  • 资源复用,池化技术,线程池与对象池以及连接池

  • 异步编程,生产者消费者模式

  • 选用合适数据结构,数组、链表、hash表,树

操作系统

程序是静态的。程序运行起来以后,变为动态的,被称为进程。

操作系统中有很多的进程在运行,通过分时的方式,调度进程执行。

进程的状态

  • 运行

进程获取到cpu分时片

  • 就绪

等待获取cpu分时片

  • 阻塞

进程等待事件完成,如磁盘IO、网络IO、锁等

单进程多线程模型。线程共享进程堆空间,每个线程有自己的线程栈空间。

线程安全,发生在多个线程同时修改了共享的资源。多个线程访问共享资源的这段代码称为临界区。

保证线程安全的做法是使用锁,只有获得锁的线程才能执行临界区的代码。

加锁之后保证了线程安全,但加锁导致了线程阻塞。线程阻塞导致高并发下系统崩溃。

避免阻塞引起的崩溃的方法:

  • 限流

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

  • 降级

关闭部分功能程序的功能,尽早释放线程

  • 避免阻塞本身

通过异步IO,无临界区等的方式(actor模型)

锁原语CAS(V,E,N)(compare and set)

  1. V表示要更新的变量

  2. E表示预期值

  3. N表示新值

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

  • 偏向锁

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

  • 轻量级锁

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

  • 重量级锁

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



多CPU下的锁:

  • 总线锁

处理器输出LOCK#信号,阻塞其它处理器,独占内存

  • 缓存锁

处理器中缓存内存区域,当多个处理器缓存相同的内存区域,内存一致性会阻止同时修改,当其他处理器回写已被锁定的内存行时,会使缓存行无效

公平锁:重量级锁

非公平锁:轻量级锁

可重入锁:偏向锁

独享锁/互斥锁,共享锁,读写锁

乐观锁:缓存锁

悲观锁:总线锁

分段锁:ConcurrentHashMap中有使用

自旋锁:不切换线程上下文,消耗CPU,如轻量级锁



文件系统

机械硬盘的主要组成

  • 主轴

  • 磁盘

  • 磁头

  • 磁头臂

  • 音图马达

  • 永磁铁

  • 空气过滤片

固态硬盘

用固态电子芯片阵列而制成的硬盘

文件存储常用数据结构

  1. B+树 (MySQL innodb文件存储结构)

  2. LSM树 (Cassandra文件存储结构)

文件控制块

文件系统将硬盘空间以块为单位进行划分,每个文件占据若干个块,然后再通过一个文件控制块FCB记录每个文件占据的硬盘数据块

文件控制块示例

inode文件控制块

  • 一个inode文件控制块中包含的文件信息有文件权限、所有者、时间、文件大小等属性信息

  • 一个inode文件控制块中有15个文件块索引,12个直接索引,一个一级索引,一个二级索引,一个三级索引

  • 每个inode最多存储12+256+256*256+256*256*256个数据块,以一个数据块4kb,则一个文件最多存储不超过70GB

分布式文件控制系统HDFS

  • hdfs中存储块分为NameNode和DataNode,NameNode中存储文件元信息,DataNode中存储数据

  • NameNode理论上存储的DataNode索引数量没有上线,DataNode一个默认大小为16MB

  • hdfs可以存储TB级以上文件,理论上可存储文件大小只取决于硬件资源存储容量

RAID独立磁盘冗余阵列

  • RAID0:使用多个磁盘存储文件,扩大磁盘存储容量,无复制

  • RAID1:使用一主一备,有一个复制

  • RAID10:结合RAID0和RAID1,既扩大单个磁盘容量上限,又有备份

  • RAID5:N块盘,数据块对N-1余数hash,这N-1数据块进行异或运算生成第N块数据块,作为校验块,为了预防其中一块盘损坏,数据丢失的问题。螺旋的存储在N块盘上(使用螺旋是为了减轻校验块的写压力)

  • RAID6:N快盘,数据块对N-2余数hash,这N-2数据块进行两种算法运算生成两个数据块,P和Q,螺旋放置在N块盘上

这几种方式在访问速度,数据可靠性,磁盘利用率上的比较如下:



用户头像

草原上的奔跑

关注

喜欢简洁干净的代码 2018.05.04 加入

使用技术,实现业务。思考业务,创新技术。

评论

发布
暂无评论
架构师训练营第七周-总结