性能测试,是结合被测系统应用架构、业务场景和实现细节、逻辑,对软件响应时间、处理速率、容错能力等进行分析测试,找到系统的性能瓶颈,并确认问题得到解决的过程。
由于工作需要,对性能测试缺陷分类进行了整理,这篇博客,聊聊常见的性能缺陷以及表现方式。。。
性能测试缺陷分类
缺陷类型 | 缺陷描述 |
硬件 | 磁盘空间 |
CPU | |
IO读写速率 | |
内存 | |
网络 | 带宽 |
网络波动 | |
CDN | |
延时 | |
丢包 | |
应用 | JVM |
代码逻辑 | |
配置 | JDK版本 |
底层配置 | |
参数配置 | |
数据库 | 索引 |
锁 | |
表空间 | |
慢SQL | |
数据量 | |
中间件 | 超时 |
线程池 | |
缓存策略 | |
最大连接数 | |
通信实现方式 | |
负载均衡 |
一、硬件
磁盘空间:磁盘空间不足导致系统运行变慢,文件、日志等无法生成存放导致的性能瓶颈;
CPU:CPU的核心功能是解释计算机指令以及处理数据,性能主要体现在其运行程序的速度上。影响运行速度的性能指标包括工作频率、Cache容量、指令系统和逻辑结构等参数;
IO读写速率:即input和output,输入和输出,主要考虑数据处理时的读写速度,页交换等情况;
内存:所有的程序都是运行在内存中的,其作用是用于暂时存放CPU中的运算数据,以及与外部存储器交换的数据,内存不足会限制程序的数据处理速度,因此这也是很重要的一项性能关注指标;
二、网络
带宽:高并发情况下,如果带宽不足,可能会导致网络资源竞争,超时等情况;
网络波动:这里是从网络的稳定性来描述,即性能测试的环境,需要一个稳定的网络环境;
CDN:即内容分发服务,有时候不同的CDN策略也会影响到“用户”感知到的系统性能表现;
延时:延时的值越大,对系统性能表现影响越大(比如格斗类的PVP游戏),且性能测试的结果也存在更大的偏差;
丢包:数据在网络上是以数据包的形式传输的,如果丢包,则可能造成报错或异常的情况;
三、应用
1、JVM
堆内存分配:根据系统硬件条件来进行合理的堆内存分配,一般来说JVM的堆内存分配不要超过系统内存的25%较好;
垃圾回收算法:JAVA的动态垃圾回收机制,是基于不同的几种回收算法来进行的,根据具体的情况,选择合适的垃圾回收策略;
OOM:即内存溢出(out of memory),这个算是性能测试中很常见的一个问题,通常是由于代码问题造成的内存泄漏、GC不够彻底、内存被耗尽引起;
2、代码逻辑
常见的情况有不合理的线程引用和内存分配;
四、配置
版本:在性能测试过程中,一定要确保被测系统的版本和实际生产保持一致,否则由于版本不同带来的些许差异可能会对性能测试带来很大的偏差和影响;
底层配置:涉及到操作系统、服务器等硬件的一些配置方式不合理,带来的性能瓶颈;
参数配置:系统架构设计中,各个不同的参数配置带来的性能瓶颈;
五、数据库
索引:索引的存在就像一个标签目录一样,在执行数据库操作时提供更为快速的执行效率,减少磁盘IO操作和执行的数据库系统时间;
锁:为了保证事务的原子性和隔离性,有了锁的存在,但有时候由于某些原因造成的表锁,也是性能瓶颈的一种表现;
表空间:不合理的表空间设计,导致的数据库性能问题;
慢SQL:慢SQL会导致数据库操作时间变长,增加IO读写以及引起一些列的资源竞争等问题,常见的慢SQL原因如下(以MySQL为例):
数据量:对同一张表来说,1W条数据和1000W条数据,对其进行操作时的性能表现也是不同的,因此在性能测试时对于数据的正确性可用性,以及数据量也是需要重点关注的;
六、中间件
超时:设置合理的请求或响应超时时间,是很有必要的,这点要根据具体的业务场景和系统架构来考虑,具体的超时时间,建议进行配置测试来设定;
线程池:之前的博客介绍过线程池的相关资料,线程池配置太小,很容易被使用完,太大的话又浪费资源,合理的线程池,建议进行配置测试来确定;
缓存策略:缓存的优点是减少请求响应过程中的传输时间,但有时候在高并发情况下,缓存很容易失效而导致缓存穿透,瞬间对服务端带来很大的压力;
最大连接数:关于连接数,之前的博客也介绍过,合理的连接数配置是很重要的,否则连接数太少容易导致队列等待、超时,连接数太多则浪费了系统资源;
通信实现方式:同步(sync)和异步(Async);
负载均衡策略:现在很多的系统都进行了服务集群,随之而来的就是负载均衡策略的实现,如果负载均衡不够“均衡”,在大数量的冲击下,容易导致某些服务的异常或者挂起;
以上内容为整理出的常见的影响系统应用性能表现的常见缺陷,更详细的内容比如实现原理、处理逻辑等请自行查阅其他资料,内容仅供参考。。。