贵金属如何用网站开发客户,油漆涂料网站建设,哪有做企业网站,黄冈网站推广软件视频简介#xff1a;压测是通过模拟用户行为对业务系统发起请求#xff0c;测算出系统的承载能力#xff0c;并对系统做一次全面的体检#xff0c;压测后可根据压测表现优化系统瓶颈#xff0c;防止出现线上故障。
作者#xff1a;灵苒
在实际的业务场景中#xff0c;压测…简介压测是通过模拟用户行为对业务系统发起请求测算出系统的承载能力并对系统做一次全面的体检压测后可根据压测表现优化系统瓶颈防止出现线上故障。
作者灵苒
在实际的业务场景中压测是必不可少的一环无论是对服务器、数据库、网络等性能瓶颈的评估还是如浏览、下单、支付等重要流量节点的业务连续性保障亦或是搬站上云整体业务稳定性的预估这些都需要性能压测来帮助你建立对系统和业务的完整认知。根据 Google 的统计如果网站打开慢每 500 毫秒用户访问量将下降 20%。根据 Amazon 统计每慢 100 毫秒交易额下降 1%。这些事件和统计数据为大家敲响了警钟也客观说明了性能压测对于企业应用的重要性。
压测是通过模拟用户行为对业务系统发起请求测算出系统的承载能力并对系统做一次全面的体检压测后可根据压测表现优化系统瓶颈防止出现线上故障。
业界常见的压测软件 JMeter 和 PTS
目前 JMeter 是性能压测领域应用最广泛的开源软件。
对于场景简单要求测试并发量不高的情况下JMeter 本地测试就能满足需求。但随着互联网用户的增加对系统承载更大并发的需求日渐提升而单台 JMeter 施压机的施压能力有一定上限所以需要使用多台施压机以提高 JMeter 的施压能力这就要使用到 JMeter 的分布式施压功能。
但 JMeter 的分布式压测前置准备较多需要注意以下几点
施压机的防火墙已关闭或打开了正确的端口。为 RMI 设置了 SSL 或禁用了它。所有施压机都在同一个子网上。如果使用 192.xxx或10.xxx IP 地址则服务器位于同一子网中。所有施压机上使用相同版本的 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原生脚本、JMeter 依赖一系列依赖 jar 包和一系列 properties 配置、及一些压测配置PTS 压测的配置例如公网/VPC 压测、并发量、引擎数量、压测时长等。
2、压测场景对场景的操作分为两方面一是对场景配置的增删改查二是对场景的压测和调试。
3、生成报告每次对场景压测都会生成一个压测任务同时生成一个报告其中包括压测的关键指标如 TPS、RT、成功率等可辅助用户排查系统性能瓶颈。此外PTS 默认将报告保存 30 天可以随时查看历史报告并且提供导出 PDF 格式的报告。
在压测领域随着压测需求日益多样化更多用户希望将云上的压测能力继承到自己的系统或者根据自己的业务系统编排自定义的压测平台从而实现自动化定制化压测需求。
所以为了方便用户便捷调度 PTS 百万并发的能力PTS 开通了 JMeter 的 OpenAPI提供了如下几类压测的核心功能编辑场景、调试场景、压测场景、查看运行时数据、查看报告。 通过集成 OpenAPI客户可以更加方便的在自己的业务场景实现 PTS 百万级并发压测的能力实现场景的增、删、改、查等各种操作一键启动压测并在压测过程中随时停止压测。同时生成的压测报告中除了JMeter 原生的日志外还有 PTS 针对某个采样器的成功率、TPS、RT 指标的聚合数据。另外还可以对报告进行查看报告列表、JMeter 原生日志以及 PTS 对 JMeter 采样器压测指标的聚合数据等功能。
那么还等什么呢来试着用 PTS 中 JMeter 的 OpenAPI 写一个属于你的百万级并发压测能力的压测平台吧
附录
具体步骤如下
引入 pom 依赖
!--创建PTS场景需要的实体类如果只使用JMeter压测则不需要引入--
dependencygroupIdcom.aliyun/groupIdartifactIdpts-api-entity/artifactIdversion1.0.1/version
/dependency
!--PTS Java SDK依赖。--
dependencygroupIdcom.aliyun/groupIdartifactIdpts20201020/artifactIdversion1.8.10/version
/dependency
!--阿里云核心库。--
dependencygroupIdcom.aliyun/groupIdartifactIdaliyun-java-sdk-core/artifactIdversion4.5.2/version
/dependency复制下列代码
import com.aliyun.pts20201020.Client;
import com.aliyun.pts20201020.models.*;
import com.aliyun.teaopenapi.models.Config;import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class StartingDemo {public static void main(String[] args) throws Exception {Client client getClient();// 创建场景String sceneId createScene(client);// 启动场景String reportId startTesting(client, sceneId);// 最多等待次数int count 0;// 查询是否已生成报告while (!hasReport(client, reportId) count 20) {// 若报告还未生成则等待(30s)一段时间再查询// 根据压测时间酌情等待Thread.sleep(30 * 1000);}// 查看报告getJMeterReport(client, reportId);}private static boolean hasReport(Client client, String reportId) throws Exception {ListJMeterReportsRequest request new ListJMeterReportsRequest();// 分页设置request.setPageNumber(1);request.setPageSize(1);// 查询条件设置request.setReportId(reportId);ListJMeterReportsResponse response client.listJMeterReports(request);return response.getBody().getReports().size() 0;}private static void getJMeterReport(Client client, String reportId) throws Exception {// 查看机器日志GetJMeterLogsResponse getJMeterLogsResponse getJMeterLogs(client, reportId);ListMapString, ? logs getJMeterLogsResponse.getBody().getLogs();// 查看采样器聚合数据GetJMeterSampleMetricsResponse getJMeterSampleMetrics getJMeterSampleMetrics(client, reportId);ListString sampleMetricList getJMeterSampleMetrics.getBody().getSampleMetricList();// 查看采样日志GetJMeterSamplingLogsResponse getJMeterSamplingLogs getJMeterSamplingLogs(client, reportId);ListString sampleResults getJMeterSamplingLogs.getBody().getSampleResults();}private static GetJMeterSamplingLogsResponse getJMeterSamplingLogs(Client client, String reportId) throws Exception {GetJMeterSamplingLogsRequest request new GetJMeterSamplingLogsRequest();// 分页设置request.setPageNumber(1);request.setPageSize(10);// 条件设置request.setReportId(reportId);GetJMeterSamplingLogsResponse response client.getJMeterSamplingLogs(request);return response;}private static GetJMeterSampleMetricsResponse getJMeterSampleMetrics(Client client, String reportId) throws Exception {GetJMeterSampleMetricsRequest request new GetJMeterSampleMetricsRequest();// 设置报告idrequest.setReportId(reportId);GetJMeterSampleMetricsResponse response client.getJMeterSampleMetrics(request);return response;}private static GetJMeterLogsResponse getJMeterLogs(Client client, String reportId) throws Exception {GetJMeterLogsRequest request new GetJMeterLogsRequest();// 分页设置request.setPageNumber(1);request.setPageSize(10);// 查询的压测引擎索引request.setReportId(reportId);GetJMeterLogsResponse response client.getJMeterLogs(request);return response;}private static String startTesting(Client client, String sceneId) throws Exception {StartTestingJMeterSceneResponse startTestingSceneResponse startTestingScene(client, sceneId);String reportId startTestingSceneResponse.getBody().getReportId();return reportId;}private static StartTestingJMeterSceneResponse startTestingScene(Client client, String sceneId) throws Exception {StartTestingJMeterSceneRequest request new StartTestingJMeterSceneRequest();request.setSceneId(sceneId);StartTestingJMeterSceneResponse response client.startTestingJMeterScene(request);return response;}private static String createScene(Client client) throws Exception {SaveOpenJMeterSceneRequest request new SaveOpenJMeterSceneRequest();// 定义场景SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterScene scene new SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterScene();// 设置场景名scene.setSceneName(test);// 设置文件列表包括JMeter脚本、JMeter压测依赖jar包、配置额度数据文件等ListSaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList fileList new ArrayListSaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList();// 设置文件的属性 需要设置文件的名称和文件公网可访问的oss地址SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList testFile new SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList();testFile.setFileName(baidu.jmx);testFile.setFileOssAddress(https://pts-openapi-test.oss-cn-shanghai.aliyuncs.com/baidu.jmx);fileList.add(testFile);scene.setFileList(fileList);// 设置场景并发可设置为100万scene.setConcurrency(1000000);// 设置引擎数量 说明一台引擎最多能发500并发最少1并发所以此处能设置的引擎数为[2,1000]另外引擎数量越多消耗vum越快scene.setAgentCount(2000);// 设置压测持续时间 60sscene.setDuration(60);// 设置测试文件的名称这个文件需包括在文件列表中scene.setTestFile(baidu.jmx);request.setOpenJMeterScene(scene);SaveOpenJMeterSceneResponse response client.saveOpenJMeterScene(request);return response.getBody().getSceneId();}private static Client getClient() throws Exception {// 填写自己的AK/SKString accessKeyId ak;String accessKeySecret sk;Config config new Config();config.setAccessKeyId(accessKeyId);config.setAccessKeySecret(accessKeySecret);Client client new Client(config);return client;}
}填写自己的 ak/sk
在上述代码的 getClient 中填写正确的 ak/sk
原文链接
本文为阿里云原创内容未经允许不得转载。