介绍:ApacheJMeter是Apache下的一款开源压测工具。它创建于1999年初,至今已有20多年的历史。JMeter具有丰富的功能和庞大的社区(用户群),是主流的开源压力测量工具之一。作者:凌然、剑泉ApacheJMeter[1]是Apache下开源的一款压测工具。它创建于1999年初,至今已有20多年的历史。JMeter具有丰富的功能和庞大的社区(用户群),是主流的开源压力测量工具之一。性能测试通常针对新系统上线或大型活动(如电商促销、春节活动等),验证系统能力,帮助排查和定位性能瓶颈。压力测试大致分为几个步骤:场景配置。配置压测场景,模拟用户(服务)与系统的交互。执行压力测试。在规定的压力等级下开始压力测试。压力监测和分析。压力测试通常关注压力RPS、成功率、服务响应时间(RT)、网络带宽等关键指标。报告摘要。披露系统能力是否满足要求,同时记录系统性能演进和优化过程。原生JMeter实现压测在JMeterGUI页面编辑压测脚本,点击开始按钮调试JMeter脚本。具体操作请参考JMeter官网[1]。对于简单的场景和低测试并发,JMeter本地测试可以满足要求。但是随着互联网用户的增多,对系统更大并发量的需求与日俱增,而单台JMeter压压机的压压能力有一定的上限,因此需要使用多台压压机来进行提高JMeter的施压能力,需要使用JMeter的分布式施压功能。JMeter的分布式压测需要用户管理和维护多台机器。使用过程中注意以下几点:压机的防火墙已经关闭或者打开了正确的端口。为RMI设置或禁用SSL。所有印刷机都在同一个子网上。如果使用192.xxx或10.xxxIP地址,则服务器位于同一子网中。所有印刷机都使用相同版本的JMeter和Java。所有压机都拷贝了拆分后的CSV数据文件,依赖的jar包等,压测过程中需要监控压机是否正常出流,压力与配置保持一致。配置加压前监控数据的采集,方便压测后生成报表。可见JMeter的分布式压测需要协调各种资源,在前期准备和施压过程中维护压力引擎比较麻烦,对实施压测的人员来说压测效率低。云上JMeter实践阿里巴巴拥有非常丰富的业务形态,每一种业务形态背后都由一系列分布式技术系统提供,随着业务的快速发展,尤其是在双十一等促销活动中,准确评估整个业务站点的服务能力成为一大技术难题。在此过程中,我们构建了自己的全链路压测体系,以应对更加复杂多样的压测需求,并将该技术输出到性能测试PTS中,同时支持原生的JMeter压测。通过控制台练习JMeter上传脚本打开PTS控制台[2]首页,在左侧导航栏选择压力中心>创建场景>JMeter压力测试,新建JMeter压力测试场景。填写场景名称,例如jmeter-test。点击场景配置页面的上传文件按钮,上传本地测试通过的test.jmx脚本。压力配置在压力配置页面,设置并发数为50,压力测试时长为2分钟。保存压测,点击保存进入压测,会弹出提示框,点击确定,PTS会开始执行云引擎上的JMeter脚本发起压测。压力测试页面如下:注:由于机器配置和网络环境的差异(PTS压力机默认4核8G,BGP多线公网),PTS上的压力测试结果可能与本地不同压力测试结果。另外,PTS上的压力配置会覆盖原脚本中的配置,原脚本是硬编码的还是使用JMeter属性配置的都无所谓。通过OpenAPI的实践,JMeter云计算将像水、电、煤一样发展,成为社会的基础设施。OpenAPI就像是一系列快速管道,连接着企业和阿里云,源源不断地为企业输送资源。利用云计算构建IT基础设施是未来的发展趋势,已成为社会共识。OpenAPI是云服务开放的重要窗口。没有OpenAPI的云服务将难以被客户系统集成,不仅影响用户体验,也制约了云厂商自身的发展。同样,在压测领域,随着压测需求越来越多样化,更多的用户希望将云端的压测能力继承到自己的系统中,或者根据自己的业务系统安排自定义压测平台,从而实现自动化和定制的压力测试要求。以下代码使用PTS的OpenAPI实现一键启动JMeter压测场景,并在压测完成后查看压测报告。引入pom依赖com.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