介绍:压测是通过模拟用户行为向业务系统发起请求,衡量系统的承载能力,对系统进行全面的体检。性能优化系统瓶颈,防止上线失败。作者:凌然在实际业务场景中,压力测试是必不可少的一环,无论是服务器、数据库、网络等性能瓶颈的评估,还是浏览、下单、支付等重要流量节点的业务连续性的性能保障,或者是对站点上云的整体业务稳定性的预估,这些都需要进行性能压测,帮助你建立对系统和业务的完整理解。据谷歌统计,如果一个网站每打开速度慢500毫秒,用户流量就会下降20%。据亚马逊统计,每慢100毫秒,交易量就会下降1%。这些事件和统计数据给大家敲响了警钟,也客观说明了性能压力测试对企业应用的重要性。压力测试是通过模拟用户行为向业务系统发起请求,衡量系统的承载能力,对系统进行全面的体检。压测结束后,可以根据压测性能优化系统瓶颈,防止上线故障。业界常见的压测软件JMeter和PTS目前JMeter是性能压测领域使用最广泛的开源软件。对于简单的场景和低测试并发,JMeter本地测试可以满足要求。但是随着互联网用户的增多,对系统更大并发量的需求与日俱增,而单台JMeter压压机的压压能力有一定的上限,因此需要使用多台压压机来进行提高JMeter的施压能力,需要使用JMeter的分布式施压功能。但是JMeter对于分布式压测有很多的前期准备,需要注意以下几点:压机的防火墙已经关闭或者打开了正确的端口。为RMI设置或禁用SSL。所有印刷机都在同一个子网上。如果使用192.xxx或10.xxxIP地址,则服务器位于同一子网中。所有印刷机都使用相同版本的JMeter和Java。所有的压机都复制了拆分后的CSV数据文件,依赖的jar包等,监控数据的采集已经配置好了。可见JMeter的分布式压测需要自己协调各种资源,前期准备比较麻烦,对于实施压测的人员来说压测效率低。PTS是阿里云开发的一款性能测试工具。一开始主要是用来模拟双十一的流量高峰。如今已经走过了十年。在场景编排、压测执行、压测监控分析、报表汇总等方面具有较为完善的能力。可以提供百万级并发、千万级TPS的流量发起能力,并且完全兼容JMeter,自然可以弥补JMeter在性能压力测试上的劣势。对于无法使用JMerer绕过集群问题的用户来说,这是一个不错的选择。PTS的JMeter压测大大简化了JMeter分布式压测过程,同时也降低了压机在压测过程中的维护成本。使用PTS的JMeter压测,用户只需要在控制台配置好要使用的机器数量,用户不需要提前准备多台Java和JMeter版本相同的压测机。同时,用户无需根据压机数量拆分CSV参数文件;压测完成后,PTS会汇总监控数据,生成详细的压测报告供用户查阅。与直接在命令行执行JMeter脚本相比,PTS使用起来更方便,可以提供海量的按需压力,可以提供简单直观的监控和报表。如何发起PTS的JMeter压测和所有压测的核心步骤一样,使用PTS的JMeter压测主要集中在创建场景、压测场景和查看报告三个步骤。1、创建场景:PTS的JMeter压测以场景为核心,压测对象为场景。场景包括JMeter(native)脚本,JMeter依赖(一系列依赖jar包和一系列属性配置),以及一些压测Configuration(PTS压测的配置,如公网/VPC压测,并发,数发动机、压力测试持续时间等)。2、压测场景:对场景的操作分为两个方面,一个是对场景的配置进行增删改查,一个是对场景进行压测和调试。3.报告生成:每个场景压测都会生成一个压测任务,同时生成一个报告,包括压测的关键指标,如TPS、RT、成功率等,可以协助用户排除系统性能瓶颈。另外,PTS默认保存报告30天,您可以随时查看历史报告,并提供PDF格式的报告。在压测领域,随着压测需求越来越多样化,更多的用户希望将云端的压测能力继承到自己的系统中,或者根据自己的业务系统安排定制的压测平台,实现自动化定制优化压力测试需求。因此,为了方便用户方便的调度PTS的百万并发能力,PTS开启了JMeter的OpenAPI,提供了以下压测核心功能:编辑场景、调试场景、压测场景、查看运行时数据、查看报告。通过OpenAPI的集成,客户可以更方便的在自己的业务场景中实现PTS百万级并发压测能力,实现场景的增删改查等多种操作,一键启动压测,以及在进行压力测试的过程中,随时停止压力测试。在同时生成的压测报告中,除了JMeter的原生日志外,还有PTS对一个sampler的成功率、TPS、RT指标的聚合数据。此外,还可以查看JMeter采样器压测指标的报表列表、JMeter原生日志、PTS聚合数据。你还在等什么?来吧,尝试在PTS中使用JMeter的OpenAPI,编写属于你的百万并发压测能力的压测平台吧!附:具体步骤如下:importpomdependenciescom.aliyunpts-api-entity1.0.1com.aliyunpts202010201.8.10com.aliyunaliyun-java-sdk-core4.5.2复制以下代码importcom.aliyun.pts20201020.Client;importcom.aliyun.pts20201020.models.*;importcom.aliyun.teaopenapi.models.Config;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;publicclassStartingDemo{publicstaticvoidmain(String[]args)throwsException{Clientclient=getClient();//创建场景StringsceneId=createScene(client);//开始场景StringreportId=startTesting(client,sceneId);//最大等待次数intcount=0;//查询报表是否生成while(!hasReport(client,reportId)&&count++<20){//如果报表没有生成,则等待(30s)一段时间再查询//WaitThread.睡眠(30*1000);}//查看报告getJMeterReport(client,reportId);}私有静态布尔值nhasReport(Clientclient,StringreportId)抛出异常{ListJMeterReportsRequestrequest=newListJMeterReportsRequest();//分页设置request.setPageNumber(1);request.setPageSize(1);//查询条件设置request.setReportId(reportId);ListJMeterReportsResponse响应=client.listJMeterReports(请求);返回响应.getBody().getReports().size()>0;}privatestaticvoidgetJMeterReport(Clientclient,StringreportId)throwsException{//查看机器日志GetJMeterLogsResponseLogsResponseter=getJMeterLogs(client,reportId);List