架构师训练营第七周 - 总结
本周主要讲了性能优化,以及操作系统和文件系统
性能优化
做性能优化,首先要对性能有一个量化的描述,通过优化前后的性能测试数据,判断性能优化的成果。
什么是性能
性能,从主观上来说就是用户感受到的打开页面的速度。比如,打开页面100ms以内,用户感觉不到页面加载停顿,会觉得网站访问还是挺快的。
从客观上来说,能用来度量性能的指标有
响应时间
并发数
吞吐量
性能计数器
System load
对象与线程数
内存使用
CPU使用
磁盘与网络IO
如何做性能测试
性能测试是一个总称,具体分为:
性能测试
以系统设计初期规划的性能指标为预期目标,对系统不断增加并发访问,验证系统在资源可接受范围内,是否能达到预期目标。
负载测试
在性能测试的基础上,继续对系统增加并发访问数,直到系统的某项或多项性能指标达到安全临界值,如某种资源已经呈饱和状态,这时候继续对系统施加压力,系统的处理能力不但不能提高,反而下降
压力测试
安全负载的情况下,继续对系统增加并发访问数,直到系统崩溃或者不能再处理任何请求,以此获得系统最大压力承受能力
稳定性测试
被测试系统在特定的硬件、软件、网络环境条件下,给系统加载一定的业务压力,使系统运行一段较长时间,以此检测系统是否稳定。生产环境,系统请求是不均匀的,呈波浪特性,因此为了更好的模拟生产环境,稳定性测试也应不均匀地对系统施加压力。
做完整的性能测试就是做不断的增加系统并发请求数,判断在这些并发请求数的情况下,系统吞吐量和响应时间的变化情况。
稳定性测试和前三种不同,稳定性测试需要周期性的增大减小单位时间并发数。
软件性能优化的两个基本原则
不要优化没有性能测试的软件
不要优化不了解的软件
性能优化的一般流程
性能测试,获得性能指标
指标分析,发现性能与资源瓶颈点
架构与代码分析,寻找性能与资源瓶颈关键所在
架构与代码优化,优化关键技术点,平衡资源利用
性能测试,进入性能优化闭环
性能优化的七层模型
机房与骨干网络性能优化
服务器与硬件性能优化
操作系统性能优化
虚拟机性能优化
基础组件性能优化
软件架构性能优化
软件代码性能优化
以上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)
V表示要更新的变量
E表示预期值
N表示新值
Java通过CAS原语在对象头中修改Mark Word实现加锁
偏向锁
指一段同步代码一直被某一个线程访问,那么该线程会自动获取锁,降低获取锁的代价
轻量级锁
当锁是偏向锁时,被另一个线程访问,偏向锁就会升级为轻量级锁,其它线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能
重量级锁
指向锁是轻量级锁时,另一个线程虽然自旋,但自旋不会一直持续下去,当自旋到一定次数,还没获取到锁,就会进入阻塞,该锁膨胀为重量级锁,重量级锁会让其它申请的线程进入阻塞,性能降低
多CPU下的锁:
总线锁
处理器输出LOCK#信号,阻塞其它处理器,独占内存
缓存锁
处理器中缓存内存区域,当多个处理器缓存相同的内存区域,内存一致性会阻止同时修改,当其他处理器回写已被锁定的内存行时,会使缓存行无效
公平锁:重量级锁
非公平锁:轻量级锁
可重入锁:偏向锁
独享锁/互斥锁,共享锁,读写锁
乐观锁:缓存锁
悲观锁:总线锁
分段锁:ConcurrentHashMap中有使用
自旋锁:不切换线程上下文,消耗CPU,如轻量级锁
文件系统
机械硬盘的主要组成
主轴
磁盘
磁头
磁头臂
音图马达
永磁铁
空气过滤片
固态硬盘
用固态电子芯片阵列而制成的硬盘
文件存储常用数据结构
B+树 (MySQL innodb文件存储结构)
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块盘上
这几种方式在访问速度,数据可靠性,磁盘利用率上的比较如下:
评论