性能测试与优化、操作系统与文件系统、Akka 总结
Date: 2020/7/22 V1.0
Author:Jessie
性能测试
性能测试是性能优化的前提和基础,也是性能优化结果的检查和度量标准。但要注意网站的性能有不同的标准和优化手段。
l 主观角度:从客户角度感受的性能。因为产品在细节给客户的体验设计不同,虽然可能两个系统在后台的系统处理性能一样,但客户的感知不同。这时需要小的技巧进行优化。如:电子邮件发送的异步通知实际发送结果的查看。
l 客观角度:性能指标衡量的性能。
性能测试指标:
1) 响应时间:系统从发出请求到最后收到响应数据所需要的时间。——系统快慢。
2) 并发数:系统能同时处理请求的数目。——系统的负载特性。在线用户数:当前登录系统的用户数)和系统用户数(可能访问系统的总用户数)。我们关注的就是并发数。
3) 吞吐量:指单位时间内系统处理请求的数量—— 系统的处理能力。TPS(每秒事务数)、HPS(每秒HTTP请求数)、QPS(每秒查询数)或者访问人数/天等指标衡量。注意:这里的TPS泛指业务,也许是请求数、查询数,不是传统数据库的事务。
三个核心指标的关系如下:
吞吐量=(1000/响应时间ms)* 并发数
性能计数器:描述服务器或操作系统性能的一些数据指标。如:System Load、对象与线程数、内存使用、CPU使用、磁盘与I/O指标等。其中:System Load为正在处理+等待处理的线程数之和,标准理想是等于cpu核数。
性能测试的方法:
性能测试包括:性能测试、负载测试、压力测试、稳定性测试。
1) 性能测试:以系统设计初期规划的性能指标为预期目标。对系统不断施加压力,验证系统在资源可接受范围内,是否达到性能预期。
2) 负载测试:在性能测试基础上,对系统继续增加并发请求增加压力,直到系统的性能指标达到安全临界值。系统资源已经饱和,继续施压,系统处理能力反而下降。
3) 压力测试:超过安全负载下,继续施加压力,直到系统崩溃或不再处理任何请求。获得系统最大的压力承受能力。
三个测试阶段TPS及响应时间分别如两图所示:
对于一个架构师,需要关注的是:在系统要求给与机器配置时,权衡在b点左侧还是b点右侧提供系统响应的硬件能力,这个与相应的硬件预算有很大关系。
稳定性测试:被测试系统在特定硬件、软件和网络环境下,给系统加载一定业务压力,使系统运行一段较长的时间,以此检测系统是否稳定。
全链路压测:在特定的业务场景下,将相关的链路完整的串联起来同时施压,尽可能模拟出真实的用户行为,探测出系统整体的真实处理能力,便于进行容量规划和性能优化。其挑战在于:
l 压测业务系统多,牵涉整条链路上的所有设施和中间件,如何保证压测流量畅通、无死角?
l 压测数据怎么构造,数据模型与真实贴近?
l 在真实环境下进行模拟全链路压测,怎么保证对线上无影响。
l 大型促销活动的巨大流量要怎么制作出来?
测试数据构造的方法
数据隔离的方法:
l 逻辑隔离:直接把测试数据与正常数据写到一起,通过特殊标识能区分开。
l 虚拟隔离:所有写数据地方做mock,并不真正写进去。
l 物理隔离:所有写数据的地方对压测流量进行识别,判断为压测写,写道隔离的位置(存储、缓存、搜索引擎等)
流量构造:
天猫双十一全链路压测的流量平台是典型的Master+slave结构,master作为压测管控slave节点,slave节点作为压测引擎,部署在全球cdn节点,模拟全球各地的用户请求。全链路压测流量平稳输出1000w+/s的用户请求,同时爆出过亿的无线用户长连接。
对于一个公司的新产品,如何定义性能指标:
l 产品人员、运营人员估计上线人数、行为路径,对系统提出需求,由SE换算成性能指标。
性能优化
软件性能优化的两大原则:
l 你不能优化一个没有测试的软件
l 你不能优化 一个你不了解的软件
也就是本着务实的心态看哪里是性能的瓶颈,了解问题是关键,不要直接盲目修改。
性能优化的一般方法:
1) 性能测试,获得性能指标
2) 指标分析,发现性能与资源瓶颈点
3) 架构与代码分析,寻找性能与资源瓶颈关键所在
4) 架构与代码优化,优化关键技术点,平衡资源利用。
5) 性能测试,进入性能优化闭环。
系统性能优化的分层思想:
1. 机房与骨干网络性能优化:异地多活的多机房架构、专线网络与自主CDN建设。
2. 服务器与硬件性能优化:使用更优的硬件,有时远超代码和架构的性能优化。
3. 操作系统性能优化
4. 虚拟机性能优化
5. 基础组件性能优化
6. 软件架构性能优化
1) 软件缓存:
从内存获取数量,减少响应时间;
减少数据库访问,降低存储设备负载压力;
缓存结果对象,而不是原始数据,减少CPU计算。
目的:优化读操作。
2)异步:
即时响应、更好的用户体验。
控制消费速度,合适的负载压力。
目的:优化写操作。
3) 集群:
使得多台服务器协同工作,对使用者而言,看起来像一台服务器。更多用户访问需要更多的计算资源,增加更多的服务器。
7. 代码性能优化
并发编程:多线程与锁
资源复用:线程池与对象池
异步编程:生产者消费者
数据结构:数组、链表、hash表、树。
操作系统
程序运行时架构:
进程的运行期状态:
l 运行:当一个进程在CPU上运行时,该进程处于运行状态。
l 就绪:进程获得除了CPU以外的一切资源,获得CPU以外的所需资源,进程就绪状态或等待运行状态。
l 阻塞:等待或睡眠状态,及时CPU分配给进程,也无法运营。
进程从服务器获取基本的内存空间。线程共享进程的内存地址空间。线程间似有的内存地址范围,其他线程不能访问。
线程栈:
l 每个线程有自己的堆栈,放在自己的空间,互不影响。
l 堆栈是先进先出的。每执行一个方法,都会压入栈。
l 正在执行的函数位于堆栈的顶部。
l 每个函数都有自己的栈帧,函数之间不会相互影响。方法的局部变量是每个线程独有的。
l 每个线程数据内部独有,线程内部不需要加锁。
栈溢出:栈帧放满了,造成这种情况:空间小;或者递归调用,没有返回函数。
Java Web应用多线程运行时环境。
线程安全:
栈属于线程,堆属于进程,如果数据放在堆里,那线程并发数据不安全。
临界区:多个线程访问共享资源的代码为临界区。解决线程安全是使用锁,将临界区代码加锁。获得锁的线程才能访问。
避免锁引起的线程阻塞,导致的资源耗尽。避免阻塞引起崩溃的方法:
1)限流:控制进入计算机的请求数,进而减少创建的线程数。
2)降低:关闭部分功能程序的执行,尽早释放线程。
3)避免阻塞:异步I/O,无临界区。(Actor模型)
锁原语CAS:系统原语,原语执行必须连续,在执行过程中不允许被中断。
CAS(V.E.N)
l V:更新的变量
l E:预期值
l N:表示新值。
Java通过CAS原语在对象头修改Mark word实现枷锁。
锁还有偏向锁、轻量级锁、重量级锁的概念。
总线锁、缓存锁、公平锁、非公平锁、可重入锁、独享锁、互斥锁、共享锁、读写锁、乐观锁、悲观锁、分段锁、自旋锁等概念,这里不再一一描述。。
文件与I/O
RAID:
l Raid0 将数据平行写在不同的数据盘上。同时写不同的硬盘三个数据块上,解决高速读写。
l RAID1: 相同的数据同时写到多块硬盘上。
l RAID10: 1、0的方式结合。
l RAID 5 : 用一块磁盘做校验方式,最常见。螺旋记不同的校验信息,避免访问压力大。分摊压力。
l RAID6:对RAID5的改进。两种校验方法,算出。损坏两块盘也能恢复。
HDFS:
当服务器坏,需要更大的文件管理能力、更高的可用性,诞生出HDFS(分布式文件系统)
以一个独立服务器存储数据;构成集群存储,以块为单位。 每个块编号,存储在哪个服务器上。文件大小不受限制。跨服务器跨机架,存三份。
Datanode启动向namenode注册、定时发送心跳;超时没有心跳,判断失效。
Datanode上记录的数据有哪些。通知有数据的其他服务器,通知把数据库复制到某个服务器上。一般会分散,每台都有。
备注:HDFS设计目标不是用来放图片的。
Akka:异步并发分布式编程框架
Akka是JAVA虚拟机平台上构建高并发、分布式和容错应用的工具包和运行时。Akka用Scala语言编写,同时提供了Scala和Java的开发接口。
发现当前大数据领域火热的spark、flink底层的分布式计算和通信实现都是akka。
核心概念:Actor
Akka处理并发的方法基于Actor模型,Actor之间通信的唯一机制就是消息传递。是一种无阻塞全异步模式。
在并发程序中线程是并发程序的基本执行单元,但在Akka中执行单元是Actor。
传统并发程序是基于面向对象的方法,通过对象的方法调用进行信息传递,如果对象的方法修改对象本身的状态,在多线程下就可能出现对象状态的不一致,此时就必须对方法调用进行同步,而同步操作会牺牲性能。
在Actor模型中并不是通过Actor对象的某个方法来告诉Actor需要做什么,而是给Actor发送一条消息。当一个Actor收到消息后,它有可能根据消息的内容做出某些行为,如更改自身状态,此时这个状态的更改是Actor自身进行的,并非由外界干预进行的。
Actor由状态(state)、行为(Behavior)和邮箱(mailBox)三部分组成
状态(state):Actor中的状态指的是Actor对象的变量信息,状态由Actor自己管理,避免了并发环境下的锁和内存原子性等问题
行为(Behavior):行为指定的是Actor中计算逻辑,通过Actor接收到消息来改变Actor的状态。
邮箱(mailBox):邮箱是Actor和Actor之间的通信桥梁,邮箱内部通过FIFO消息队列来存储发送方Actor消息,接受方Actor从邮箱队列中获取消息
Receive Message:
Send Message:
Akka在金融借贷领域的应用,因为金融领域事务不多,适合用Akka。
参考文献
https://blog.csdn.net/pml18710973036/article/details/87807387
版权声明: 本文为 InfoQ 作者【架构5班杨娟Jessie】的原创文章。
原文链接:【http://xie.infoq.cn/article/4a32cee7b593bb98a6ee94f50】。文章转载请联系作者。
评论