写点什么

性能测试、操作系统与文件系统

用户头像
Lane
关注
发布于: 2020 年 07 月 22 日

一、性能测试

定义:性能测试是性能优化的前提和基础,也是性能优化结果的检查和度量标准。不通视角下的网站性能有不同的标准,也有不同的优化手段。



主观视角:用户感受到的性能

客户视角:性能指标衡量的性能

性能测试指标

不通视角下有不同的性能标准,不同的标准有不同的性能测试指标,网站性能测试的主要指标有响应时间、并发数、吞吐量、性能计数器等。

1.响应时间

指应用系统从发出请求开始到收到最后的响应数据所需要的时间。响应时间是系统最重要的性能指标,直观的反映了系统的“快慢”。

站在客户端的角度,从发出的第一个字节,到收到响应后的最后一个字节,这中间的时间差叫做响应时间。

2.并发数

系统能够同时处理请求的数目,这个数字也反映了系统的负载特性。对于网站而言,并发数即系统并发用户数,指同时提交请求的用户数目,与此相对应,还有在线用户数(当前登录系统的用户数)和系统用户数(可能访问系统的总用户数)。

3.吞吐量

单位时间内系统处理的请求的数量,体现系统的处理能力。对于网站,可以用“请求数/秒” 或是“页面数/秒” 来衡量,也可以用“访问人数/天” 或是 “处理的业务数/小时”等来衡量

TPS(每秒事务数)也是吞吐量的一个指标,此外还有HPS(每秒HTTP请求数),QPS(每秒查询数)等。



体会上面的这个数学公示的意思,在实际的性能测试场景中,并发数是一定的,响应时间越短,吞吐量也就越高。

举个例子: 一次响应时间是100ms,并发数是1,也就是一个并发100ms返回了,在这里 1000/100ms = 10也就表示1s钟可以发10次请求。

4.性能计数器

描述服务器或操作系统性能的一些数据指标。包括 System Load、对象与线程数、内存使用、CPU使用、磁盘与网络 I/O 等指标。这些指标也是系统监控的重要

参数,对这些指标设置报警阀值,当监控系统发现性能计数去超过阀值的时候,就向运维和开发人员报警,及时发现处理系统异常。



System Load avg: 1.89,2,32,2.35 代表的意思是 

正在处理的线程数儿  + 等待被执行的线程数  之和

这三个值分别是 5 分钟,10分钟 和 15分钟这三个时间段的平均值



这个值多大的时候是比较合理的?

答:理想情况下是cpu的核数儿。

如果System Load 的值小于CPU的核心数表示系统还有处理能力

如果大于了CPU的核心数表示系统有些过载了

稳定性测试

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



负载测试

定义: 对系统不断地增加并发请求以增加系统压力,直到系统的某项或多项性能指标达到安全临界值,如某种资源已经呈饱和状态,这时候继续对系统施加压力,系统的处理能力不但不能提高,反而会下降。



压力测试

定义: 超过安全负载的情况下,对系统继续施加压力,直到系统崩溃或不能再处理任何请求,以此获得系统最大压力承受能力,也就是测试出系统的崩溃点。



二、性能优化

基本原则

不能优化一个没有测试的软件,不能优化一个不了解的软件。

分层思想

1. 机房与骨干网络优化

异地多活,专线网络与自主CDN

2.服务器硬件性能优化(垂直伸缩)

使用更优的CPU,磁盘,内存,网卡,对软件的性能优化可能是数量级的,有时候远远

超过代码和架构的性能优化。

3.虚拟机的性能优化

4.基础组件的性能优化,例如tomcat, spring这些框架,它对性能还是有影响的

5.软件架构性能优化

6.软件代码性能优化

三、性能优化案例

1.硬件性能优化案例

Spark作业过程需要大量数据,进行资源瓶颈分析,发现大量时间消耗在网络传输上。





可以看到上图中从90多秒的时候到150秒的时候网络带宽几乎跑满了,也就意味这这个时候这个网卡的极限就是传输这么多

分析: 发现需要在网络上传递大量的数据,花费了很长时间

解决方案:升级网卡,10G网卡代替1G网卡,如下图,这样的话网卡的带宽高了,性能也就得到了极大的提升。



2.操作系统性能优化案例



四、性能优化三板斧

缓存

从内存读取数据,用于优化读操作

异步

即使响应,用户体验好,主要优化写操作

集群

访问压力一台扛不住就多台机器一起抗

五、软件代码性能优化

遵循面向对象的设计原则与设计模式编程,很多时候程序性能不好不是因为性能上有什么技术挑战,仅仅就是因为代码太烂了。

解决思路:

并发编程:多线程与锁

资源复用:线程池与对象池

异步编程:生产者与消费者

数据结构:数组、链表、hash表、树

六、程序运行时架构

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

进程的运行期状态

运行:当一个进程在CPU上运行时,则称该进程处于运行状态,处于运行状态的进程的数目小于等于CPU的数目

就绪:当一个进程获得了除CPU以外的一切所需资源,只要得到CPU即可运行,则称此进程处于就绪状态,就绪状态有时候也被成为等待运行状态。

阻塞:也成为等待或睡眠状态,当一个进程正在等待某一个时间发生(例如等待I/O完成,等待锁.....)而暂时停止运行,这时即使把CPU分配给进程也无法运行,故称该进程处于阻塞状态。



进程 vs 线程

不通进程轮流在CPU上执行,每次都要进行进程间CPU切换,代价非常大。因此服务器应用通常是单进程多线程的。

进程从操作系统获得基本的内存空间,所有的线程共享着进程的内存地址空间。而每个线程也会拥有自己私有的内存地址范围,其他线程不能访问。

Java应用多线程运行时视图



线程安全

当某写代码修改内存堆(进程共享内存)里的数据的时候,如果有多个线程在同时进行,就可能会出现修改数据的情况,比如,两个线程同时对一个堆中的数据执行+1操作,最终这个数据只会被加以此,这就是线程安全问题,实际上线程的架构应该好似以此加一。

解决线程安全问题

在临界区加锁

多个线程访问共享资源的这段代码被称为临界区,解决线程安全问题的主要方法是使用锁,将临界区的代码枷锁,只有获得锁的线程才能执行临界区的代码。

lock.lock();//进程获得锁
i++; //临界区代码,i位于堆中
lock.unlock(); //线程释放锁

lock锁是通过 锁原语CAS实现的,

CAS(V,E,N)

V表示要更新的变量

E表示预期值

N表示新值

如果V值等于E值,则将V的值设为N,若V值和E值不同,什么都不做。

CAS是一种系统原语,原语的执行必须是连续的,在执行过程中不允许被中断。

避免阻塞引起的崩溃

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

降级:关闭部分功能的执行,今早释放线程。

反应式:异步;无临界区(Actor模型)



七、锁

偏向锁:值一段同步代码一直被一个线程所访问,那么该线程会自动获得锁,降低获得锁的代价。

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

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















八、文件系统

B+树 MySQL中的数据检索



LSM树 这种算法是HBase里所采用的算法



文件控制块



Linux Inode文件控制块



分布式文件系统HDFS

两种角色:

1.NameNode文件控制块儿 作用是元数据控制,它是用来记录元数据的文件名,创建者,修改时间等信息

2.DataNodes 真正的文件数据块儿,它是存储到数据节点上的。





用户头像

Lane

关注

还有梦想 2018.07.05 加入

还未添加个人简介

评论

发布
暂无评论
性能测试、操作系统与文件系统