如何快速调度 PTS 的百万并发能力

简介:压测是通过模拟用户行为对业务系统发起请求,测算出系统的承载能力,并对系统做一次全面的体检,压测后可根据压测表现优化系统瓶颈,防止出现线上故障。

作者:灵苒

在实际的业务场景中,压测是必不可少的一环,无论是对服务器、数据库、网络等性能瓶颈的评估,还是如浏览、下单、支付等重要流量节点的业务连续性保障,亦或是搬站上云整体业务稳定性的预估,这些都需要性能压测来帮助你建立对系统和业务的完整认知。根据 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压测则不需要引入-->
<dependency><groupId>com.aliyun</groupId><artifactId>pts-api-entity</artifactId><version>1.0.1</version>
</dependency>
<!--PTS Java SDK依赖。-->
<dependency><groupId>com.aliyun</groupId><artifactId>pts20201020</artifactId><version>1.8.10</version>
</dependency>
<!--阿里云核心库。-->
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.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);List<Map<String, ?>> logs = getJMeterLogsResponse.getBody().getLogs();// 查看采样器聚合数据GetJMeterSampleMetricsResponse getJMeterSampleMetrics = getJMeterSampleMetrics(client, reportId);List<String> sampleMetricList = getJMeterSampleMetrics.getBody().getSampleMetricList();// 查看采样日志GetJMeterSamplingLogsResponse getJMeterSamplingLogs = getJMeterSamplingLogs(client, reportId);List<String> 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包、配置额度数据文件等List<SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList> fileList = new ArrayList<SaveOpenJMeterSceneRequest.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

原文链接

本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab字符串数组里里固定格式的内容,字符串数组和字符数组中的文本

用字符串数组表示文本您可以使用 string 数据类型将任何 1n 字符序列存储为字符串。从 R2017a 开始&#xff0c;您可以用双引号将文本括起来以创建字符串。str "Hello, world"str "Hello, world"虽然文本 "Hello, world" 的长度为 12 个字符&am…

架构师说低代码:走出半生,归来仍是“毒瘤”!

当今世界正在经历数字化与智能化的发展蜕变&#xff0c;其中软件开发技术作为推动数字化转型的必要支撑&#xff0c;成为企业变革的重要推手。云原生作为产业数字化的关键技术之一&#xff0c;催生出低代码等软件开发模式&#xff0c;让开发逐渐走向低门槛、迭代快、可扩展。今…

网关流控利器:结合 AHAS 实现 Ingress/Nginx 流量控制

简介&#xff1a;微服务的稳定性一直是开发者非常关注的话题。随着业务从单体架构向分布式架构演进以及部署方式的变化&#xff0c;服务之间的依赖关系变得越来越复杂&#xff0c;业务系统也面临着巨大的高可用挑战。 作者&#xff1a;涂鸦 微服务的稳定性一直是开发者非常关…

matlab vs2010编译器xml,如何在MATLAB R2010a 中使用Visual C++ 2010编译器

1、安装补丁VS2010MEXSupport.zip参考http://www.mathworks.cn/support/solutions/en/data/1-D5W493/index.html?solution1-D5W493由于MATLAB R2010a 发布的时间要比VS2010早&#xff0c;所以在该版本识别不了VC2010编译器。不过R2010a之后的版本应该不会有这种问题了。解压补…

云钉一体加速,阿里云计算巢与钉钉深度融合、共建应用新生态

简介&#xff1a;云合计划再升级&#xff0c;“云钉一体”战略按下加速键。 1月13日&#xff0c;阿里云宣布云合计划再升级&#xff0c;计算巢与钉钉深度融合互通&#xff0c;实现一键上云、一键上钉钉&#xff0c;助力软件厂商更快地完成技术升级&#xff0c;更好地专注于自身…

DevStream 进入 CNCF 沙箱,探索云原生时代的高效 DevOps 实践

2022 年 6 月 15 日&#xff0c;云原生计算基金会 (CNCF) 宣布 DevStream 正式成为 CNCF 沙箱&#xff08;Sandbox&#xff09;项目。 DevStream 是一个开源的 DevOps 工具链管理器&#xff0c;可以通过一个简单的配置文件&#xff0c;将软件研发生命周期中各环节的 DevOps 工…

阿里云何万青:南坡VS北坡,阿里云高性能计算行业实践

简介&#xff1a;北坡模式&#xff1a;借助于云上大计算性能突破来提供HPC服务&#xff0c;切入的重点更加聚焦于云服务。 随着数字化转型的深入&#xff0c;行业应用对算力提出更高要求。为满足不同行业灵活的业务形态与计算需求&#xff0c;以云计算技术为服务模式创新的技术…

理论塔板数 matlab,matlab作图法计算精馏理论板数

MATLAB图解法计算精馏塔理论板数中文摘要&#xff1a;双组份精馏是化工生产中重要的单元操作&#xff0c;运用matlab【1】的强大功能&#xff0c;通过绘制精馏段和提留段操作线方程以及进料q线方程&#xff0c;运用图解法计算理论板数和进料板位置&#xff0c;使得求解精确、简…

双引擎驱动Quick BI十亿数据0.3秒分析,首屏展示时间缩短30%

简介&#xff1a;在规划中&#xff0c;Quick BI制定了产品竞争力建设的三大方向&#xff0c;包括Quick&#xff08;快&#xff09;能力、移动端能力和集成能力。针对其中的产品“报表查看打开慢”“报表开发数据同步慢”等性问题开展专项战役——Quick战役&#xff0c;以实现展…

Quick BI产品核心功能大图(六)开放集成

简介&#xff1a;企业想要拥有领先的数据分析能力&#xff0c;自研往往需要投入巨大的人力和财力。 Quick BI作为唯一一个连续两年入选Gartner魔力象限的中国BI产品&#xff0c;具备强大的全链路开放集成能力&#xff0c;可以轻松的与企业原有系统匹配融合&#xff0c;帮助企业…

php error_get_last(),PHP捕获异常register_shutdown_function和error_get_last的使用

register_shutdown_function注册一个会在php中止时执行的函数&#xff0c;注册一个 callback &#xff0c;它会在脚本执行完成或者 exit() 后被调用。error_get_last获取最后发生的错误&#xff0c;包含type(错误类型)&#xff0c;message(错误消息)&#xff0c;file(发生错误所…

低复杂度 - 服务网格的下一站

作者 | Addo Zhang来源 | 云原生指北译者&#xff1a;作为一个曾经在新造车公司的基础架构团队任职&#xff0c;为支持公司的“互联网基因”和“数字化转型”落地了云原生基础设施平台&#xff0c;并在尝试采用服务网格未成的我来说&#xff0c;看到这篇文章深有感触。尤其是文…

ADBPGGreenplum成本优化之磁盘水位管理

简介&#xff1a;本文我们将通过一个实际的磁盘空间优化案例来说明&#xff0c;如何帮助客户做成本优化。 作者 | 玉翮 来源 | 阿里技术公众号 一 背景描述 目前&#xff0c;企业的核心数据一般都以二维表的方式存储在数据库中。在核心技术自主可控的大环境下&#xff0c;政企…

阿里云图数据库GDB V3引擎发布,加速开启“图智”未来

简介&#xff1a;无论是学术界还是产业界&#xff0c;都对图数据库有比较高的预期。Gartner发布的《2021年十大数据和分析技术趋势》中提到&#xff1a;“到2025年图技术在数据和分析创新中的占比将从2021年的10%上升到80%。”应用需求推动着技术的发展&#xff0c;在GDB V3的引…

url 函数 php,php中url处理函数总结

在php中url处理函数有很多&#xff0c;如有:http_build_query,compact,urldecode、urlencode,parse_url,rawurldecode等等函数。http_build_query(PHP 5) http_build_query — 生成 URL-encode 之后的请求字符串 代码如下复制代码$data array(foo>bar,baz>boom,cow>m…

阿里云EMR Remote Shuffle Service在小米的实践

简介&#xff1a;阿里云EMR自2020年推出Remote Shuffle Service(RSS)以来&#xff0c;帮助了诸多客户解决Spark作业的性能、稳定性问题&#xff0c;并使得存算分离架构得以实施&#xff0c;与此同时RSS也在跟合作方小米的共建下不断演进。本文将介绍RSS的最新架构&#xff0c;在…

Spring Boot Serverless 实战系列 | 性能调优

简介&#xff1a;Spring Boot Serverless 实战系列第四篇来啦&#xff0c;本文将向大家介绍如何对 Serverless 应用进行性能调优。 SpringBoot 是基于 Java Spring 框架的套件&#xff0c;它预装了 Spring 的一系列组件&#xff0c;让开发者只需要很少的配置就可以创建独立运行…

Kafka操作指令笔记

查堆积用命令查&#xff1a; ./kafka-consumer-groups.sh --bootstrap-server {kafka集群地址} --describe --group {消费组名称}bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --all-groups #查看所有组别的积压情况可以通过grep、awk或其他文…

java俄罗斯方块旋转,俄罗斯方块旋转算法研究

发表于 2012-12-05 06:36:24 by 月小升最近在阅读俄罗斯方块的A1 A2 A3 A4B1 B2 B3 B4C1 C2 C3 C4D1 D2 D3 D4旋转以B2 B3 C2 C3 中间的点为旋转轴。旋转以后矩阵变为D1?C1?B1?A1D2?C2?B2?A2?D3?C3?B3?A3D4?C4?B4 A41&#xff0c;1数据变成了 1,4问题&#xff1a;旋…

消息队列 RocketMQ 遇上可观测:业务核心链路可视化

简介&#xff1a;本篇文章主要介绍 RocketMQ 的可观测性工具在线上生产环境的最佳实践。RocketMQ的可观测性能力领先业界同类产品&#xff0c;RocketMQ 的 Dashboard 和消息轨迹等功能为业务核心链路保驾护航&#xff0c;有效应对线上大规模生产使用过程中遇到的容量规划、消息…