性能测试与优化、操作系统与文件系统、Akka 总结

发布于: 5 小时前

Date:  2020/7/22    V1.0

 Author:Jessie

性能测试

性能测试是性能优化的前提和基础,也是性能优化结果的检查和度量标准。但要注意网站的性能有不同的标准和优化手段。

主观角度:从客户角度感受的性能。因为产品在细节给客户的体验设计不同,虽然可能两个系统在后台的系统处理性能一样,但客户的感知不同。这时需要小的技巧进行优化。如:电子邮件发送的异步通知实际发送结果的查看。

客观角度:性能指标衡量的性能。

 

性能测试指标:

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  大型促销活动的巨大流量要怎么制作出来?

 

测试数据构造的方法

数据隔离的方法

逻辑隔离:直接把测试数据与正常数据写到一起,通过特殊标识能区分开。

虚拟隔离:所有写数据地方做mock,并不真正写进去。

物理隔离:所有写数据的地方对压测流量进行识别,判断为压测写,写道隔离的位置(存储、缓存、搜索引擎等)

 

流量构造:

 

天猫双十一全链路压测的流量平台是典型的Master+slave结构,master作为压测管控slave节点,slave节点作为压测引擎,部署在全球cdn节点,模拟全球各地的用户请求。全链路压测流量平稳输出1000w+/s的用户请求,同时爆出过亿的无线用户长连接。

对于一个公司的新产品,如何定义性能指标:

 

产品人员、运营人员估计上线人数、行为路径,对系统提出需求,由SE换算成性能指标。

 

性能优化

软件性能优化的两大原则:

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

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

也就是本着务实的心态看哪里是性能的瓶颈,了解问题是关键,不要直接盲目修改。

 

   性能优化的一般方法:

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

 

发布于: 5 小时前 阅读数: 8
用户头像

还未添加个人签名 2018.08.21 加入

码过代码、做过产品;擅长码字、演讲、认真做事之人。

评论

发布
暂无评论
性能测试与优化、操作系统与文件系统、Akka总结