写点什么

第七周学习心得

用户头像
cc
关注
发布于: 2021 年 01 月 10 日

一. 性能测试

1. 定义

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

2. 性能测试的三大指标

2.1 响应时间

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

2.2 并发量

系统能够同时处理请求的数目,这个数字也反应了系统的负载特性。对于网站而言,并发数即系统的并发用户数,指同时提交请求的用户数目,与此对应,还有在线用户和系统用户数。

2.3 吞吐量

指单位时间内系统处理的请求数量,体现系统的处理能力。

TPS(每秒事务数)

HPS(每秒的 HTTP 请求数)

QPS(每秒查询数)

2.4 三个指标之间的公式

吞吐量 = (1000/响应时间 ms) * 并发数

2.4.1 性能计数器

是描述服务器或这个操作系统的一些性能指标。包括 System Load,对象与线程数,内存使用,CPU 使用,磁盘与网络 I/O 等指标。这些指标也是系统监控的重要参数,对这些指标设置报警阈值的时候就向运维和开发人员发送警报,及时发现处理系统异常。

2.5 性能测试的方法

2.5.1 性能测试

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

2.5.2 负载测试

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

2.5.3 压力测试

超过安全负载的情况下,对系统继续施加压力,直到系统奔溃或不能再处理任何请求,以此获得系统最大压力承受能力。

2.5.4 稳定性测试

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

二. 性能优化

2.1 基本原则

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

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

2.2 性能测试的一般方法

性能测试获得性能指标。

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

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

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

性能测试,进入性能优化闭环。

2.3 性能优化的分层思想

2.3.1 机房与骨干网络性能优化

异地多活的多机房架构。

专线网络与自主 CDN 建设。

2.3.2 服务器与硬件性能优化

使用性能更好的 CPU,磁盘,内存,网卡,对软件的优化可能是数量级的。有时远远超过代码和架构的性能优化。

2.3.3 操作系统性能优化

利用性能计数器来监控和分析资源的消耗,从而有针对性的进行优化。

2.3.4 虚拟机性能优化

虚拟机性能优化就是指的是通过内存的合理分配,以及合理的设置参数,避免 jvm 频繁的发生垃圾回收,减少系统停顿时间等。

2.3.5 基础组件性能优化

经过性能测试后,通过更换或升级组件的版本,来减少资源的消耗的手段。

2.3.6 软件架构性能优化

缓存,异步,集群

2.3.7 软件代码性能优化

并发编程,多线程与锁。

资源复用,线程池与对象池。

异步编程,生产者和消费者。

数据结构,数组,链表,hash 表,树。

二. 操作系统

1. 进程

进程是具有一定独立功能的程序在一个数据集合上的一次动态执行过程。

操作系统通过进程的分时执行,在 CPU 资源有限的情况下实现数以千计的并发请求。

1.1 进程运行期的状态

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

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

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

2. 线程

是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

2.1 线程栈

线程栈存储的信息是指某时刻线程中方法调度的信息,当前调用的方法总是位于栈顶。当某个方法被调用时,此方法的相关信息压入栈顶。

2.2 线程安全

当代码修改进行共享内存里的数据时,如果有多个线程同时在执行时,就可能会出现同时修改的情况,但是这个数据最终只会被修改一次。这个就是人们常说的线程安全问题。

2.3 临界区

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

2.4 阻塞导致高并发系统的奔溃

锁会引起线程阻塞,阻塞导致线程既不能继续执行,也不能释放资源。进而导致资源耗尽。最终导致系统奔溃。

2.5 避免阻塞引起的奔溃

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

降级: 关闭部分程序的功能,尽早释放程序。

避免阻塞: 异步 I/O; 无临界区。

3. 锁

3.1 偏向锁

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

3.2 轻量级锁

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

3.3 重量级锁

当锁是轻量级锁时,另一个线程虽然会自旋,当自旋到一定次数时,还没有获得到锁,就会进入阻塞,该锁膨胀为重量级锁,重量级锁会让其他申请的线程进入阻塞,性能降低。

3.4 各种锁介绍

3.4.1 总线锁

使用处理器的 Lock#信号,当一个处理器在内存总线上输出此型号时,其他处理器的请求将被中断,该处理器独占内存。

3.4.2 缓存锁

指在内存区域如果被缓存在处理器的缓存中,并且在 Lock 操作期间被锁定,那么当他执行操作回写到内存时,处理器不在总线上声言 Lock#信号。而实修改内部的内存地址,并允许他的缓存一致性机制来保证操作的原子性,因为缓存一致性机制阻止同时修改由两个以上处理器缓存的内存数据,当其他处理器 h 回写已被锁定的缓存行数据时,会使缓存行无效。

3.4.3 公平锁

多个线程按照申请锁的顺序来获得锁。

3.4.4 非公平锁

多个线程并不是按照申请锁的顺序来获得锁的,有可能后申请的先获得锁,可能会造成饥饿现象。

3.4.5 可重入锁

某个线程已经获得锁,可以再次获得锁而不会出现死锁。

3.4.6 独享锁/互斥锁

该锁一次只能被一个线程所持有。

3.4.7 共享锁

可以被多个线程持有。

3.4.8 读写锁

多个读线程之间并不互斥,而写线程与其他线程要互斥。

3.4.9 乐观锁

对于同一个数据的并发操作,是不会发生修改的。在更新数据时,检查是否被修改过,如果已修改,则放弃。

3.4.10 悲观锁

对于同一个数据的并发操作,是一定会发生修改的。因此只要对同一个数据进行并发操作就采取枷锁的形式。

3.4.11 分段锁

细化锁的颗粒度,当操作不需要更新整个数组数据时,就仅仅针对数组的一段进行加锁操作。

3.4.12 自旋锁

指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,从而减少线程上下文切换的内存消耗。缺点是循环会消耗 CPU 的资源。

用户头像

cc

关注

还未添加个人签名 2018.03.19 加入

还未添加个人简介

评论

发布
暂无评论
第七周学习心得