性能测试常见瓶颈分析及调优方法

本文涉及的产品
性能测试 PTS,5000VUM额度
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 事务成功率在某些时候也可以视为请求成功率,在断言判断时以code/status等内容来作为请求是否成功的衡量依据;

在性能测试过程中,最重要的一部分就是性能瓶颈定位与调优。而引发性能瓶颈的原因是多种多样的,在之前的博客:常见的性能测试缺陷有进行介绍。这篇文章,来聊聊性能测试过程中的一些注意事项,以及常见的一些性能缺陷表现及如何进行定位分析并且调优。。。


常见性能测试缺陷:https://www.cnblogs.com/imyalost/p/9611566.html

 

一、注意事项


1、断言


在压测时,为了判断发送的请求是否成功,一般会通过对请求添加断言来实现。使用断言时,建议遵循如下规范:


①、断言内容尽量以status/code、msg/message来判断(当然前提是接口设计遵循Restful规范)


Jmeter示例:


640.jpg


阿里云PTS:


如果使用的是PTS压测,则断言设置中,以code/status、msg/message等于对应的值为准;


②、尽可能不要将所有的Response Body内容作为断言判断的内容,这样很可能会导致大量的“断言”失败;


PS:然后很遗憾的是,见过很多做压测的童鞋,断言内容以整个响应参数内容做断言,导致大量的报错。


2、成功率


一般在性能测试中,我们都追求99.99%的成功率,但在实际的测试过程中,为了尽可能覆盖代码逻辑,在准备阶段会尽可能的准备较多的热点数据去做到覆盖。这样的话,我们所关注的成功率指标,就要分为如下两种:


①、事务成功率


事务成功率在某些时候也可以视为请求成功率,在断言判断时以code/status等内容来作为请求是否成功的衡量依据;


②、业务成功率


实际的业务场景中,所谓的成功率,并不能仅根据返回的code/status来判断。比如:一个查询请求,无论是返回正确的查询结果还是由于对应数据返回空,这个请求都是成功的。


对应的响应参数可能是: {"status":"200","message":"success"} ;也可能是: {"status":"200","message":"暂无对应结果"}


PS:在性能测试过程中,考虑到业务成功率和请求成功率的不同指标,结合断言内容,需要灵活设置断言的方式(当然,我依然建议遵循如上的2点断言规范)!

 

二、常见性能瓶颈解析及调优方案


在性能测试中,导致性能出现瓶颈的原因很多,但通过直观的监控图表现出来的样子,根据出现的频次,大概有如下几种:


性能瓶颈出现频次 具体表现
TPS波动较大
高并发下大量报错
集群类系统,各服务节点负载不均衡
并发数不断增加,TPS上不去,CPU耗用不高
压测过程中TPS不断下降,CPU使用率不断降低


下面对常见的几种性能瓶颈原因进行解析,并说说常见的一些调优方案:


1、TPS波动较大


原因解析:出现TPS波动较大问题的原因一般有网络波动其他服务资源竞争以及垃圾回收问题这三种。


性能测试环境一般都是在内网或者压测机和服务在同一网段,可通过监控网络的出入流量来排查;


其他服务资源竞争也可能造成这一问题,可以通过Top命令或服务梳理方式来排查在压测时是否有其他服务运行导致资源竞争;


垃圾回收问题相对来说是最常见的导致TPS波动的一种原因,可以通过GC监控命令来排查,命令如下:


# 实时打印到屏幕
jstat -gc PID 300 10
jstat -gcutil PID 300 10
# GC信息输出到文件
jstat -gc PID 1000 120 >>/path/gc.txt
jstat -gcutil PID 1000 120 >>/path/gc.txt


调优方案


网络波动问题,可以让运维同事协助解决(比如切换网段或选择内网压测),或者等到网络较为稳定时候进行压测验证;


资源竞争问题:通过命令监控和服务梳理,找出压测时正在运行的其他服务,通过沟通协调停止该服务(或者换个没资源竞争的服务节点重新压测也可以);


垃圾回收问题:通过GC文件分析,如果发现有频繁的FGC,可以通过修改JVM的堆内存参数Xmx,然后再次压测验证(Xmx最大值不要超过服务节点内存的50%!)


2、高并发下大量报错


原因解析:出现该类问题,常见的原因有短连接导致的端口被完全占用以及线程池最大线程数配置较小超时时间较短导致。


调优方案


短连接问题:修改服务节点的tcp_tw_reuse参数为1,释放TIME_WAIT scoket用于新的连接;


线程池问题:修改服务节点中容器的server.xml文件中的配置参数,主要修改如下几个参数:


# 最大线程数,即服务端可以同时响应处理的最大请求数
maxThreads="200"                        
# Tomcat的最大连接线程数,即超过设定的阈值,Tomcat会关闭不再需要的socket线程       
maxSpareThreads="200"               
# 所有可用线程耗尽时,可放在请求等待队列中的请求数,超过该阈值的请求将不予处理,返回Connection refused错误
acceptCount="200"                 
# 等待超时的阈值,单位为毫秒,设置为0时表示永不超时
connectionTimeout="20000"         


3、集群类系统,各服务节点负载不均衡


原因解析:出现这类问题的原因一般是SLB服务设置了会话保持,会导致请求只分发到其中一个节点。


调优方案:如果确认是如上原因,可通过修改SLB服务(F5/HA/Nginx)的会话保持参数为None,然后再次压测验证;


4、并发数不断增加,TPS上不去,CPU使用率较低


原因解析:出现该类问题,常见的原因有:SQL没有创建索引/SQL语句筛选条件不明确、代码中设有同步锁,高并发时出现锁等待;


调优方案


SQL问题:没有索引就创建索引,SQL语句筛选条件不明确就优化SQL和业务逻辑;


同步锁问题:是否去掉同步锁,有时候不仅仅是技术问题,还涉及到业务逻辑的各种判断,是否去掉同步锁,建议和开发产品同事沟通确认;


5、压测过程中TPS不断下降,CPU使用率不断降低


原因解析:一般来说,出现这种问题的原因是因为线程block导致,当然不排除其他可能;


调优方案:如果是线程阻塞问题,修改线程策略,然后重新验证即可;


6、其他


除了上述的五种常见性能瓶颈,还有其他,比如:connection reset、服务重启、timeout等,当然,分析定位后,你会发现,我们常见的性能瓶颈,


导致其的原因大多都是因为参数配置、服务策略、阻塞及各种锁导致。。。


性能瓶颈分析参考准则:从上至下、从局部到整体!

 

以上分析及调优方案仅供参考,具体定位还需要根据日志监控等手段来分析调优。。。

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
23天前
|
数据采集 监控 机器人
浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)
最开始转转的客服系统体系如IM、工单以及机器人等都是使用第三方的产品。但第三方产品对于转转的业务,以及客服的效率等都产生了诸多限制,所以我们决定自研替换第三方系统。下面主要分享一下网页端IM技术及相关测试方法,我们先从了解IM系统和WebSocket开始。
42 4
|
2月前
|
测试技术 API 项目管理
API测试方法
【10月更文挑战第18天】API测试方法
64 1
|
2月前
|
测试技术 UED
软件测试中的“灰盒”方法:一种平衡透明度与效率的策略
在软件开发的复杂世界中,确保产品质量和用户体验至关重要。本文将探讨一种被称为“灰盒测试”的方法,它结合了白盒和黑盒测试的优点,旨在提高测试效率同时保持一定程度的透明度。我们将通过具体案例分析,展示灰盒测试如何在实际工作中发挥作用,并讨论其对现代软件开发流程的影响。
|
1天前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
24 10
|
28天前
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。
|
1月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
36 6
|
28天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
62 1
|
1月前
|
JavaScript 安全 编译器
TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法
本文深入探讨了 TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法,并通过实际案例展示了其在项目中的应用效果,旨在提升代码质量和开发效率。
47 6
|
1月前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
227 2
|
11天前
|
监控 JavaScript 测试技术
postman接口测试工具详解
Postman是一个功能强大且易于使用的API测试工具。通过详细的介绍和实际示例,本文展示了Postman在API测试中的各种应用。无论是简单的请求发送,还是复杂的自动化测试和持续集成,Postman都提供了丰富的功能来满足用户的需求。希望本文能帮助您更好地理解和使用Postman,提高API测试的效率和质量。
55 11