比较容易实现,有多种实现手段。
一种是引流的方式,就是将线上集群中的流量集中到少部分的机器上,当这些机器流量变大时就会达到瓶颈,就能得出单机的极限性能,根据单机的性能就能推算出整个集群的性能。由于是线上的真实用户的访问请求,这种引流的方式不会产生额外的测试数据,所以对读、写系统都合适。
另外一种是放大流量的方式。例如通过 TCPCopy 工具可以把一个请求 copy 出多个重复的请求;还有一个方式是针对页面类型这种系统,可以在页面中注入一些JavaScript 脚本
(new Image(.src='http://item.beta.taobao.com/item.htm?id=$ fitemId}'),在请求这个页面时,会自动向服务端额外发送一个请求,这样可以让用户帮我们制造流量达到压测的目的。当然这种方式会产生压测数据,所以只适合读系统而不适合写系统。
全链路压测是目前比较好的、可以制造出线上大流量的手段。它的优点在于能串联线上全部系统,并让每个系统同时达到流量峰值(尤其是公共系统),所以适用的场景更多,但实施成本相对较高。
全链路压测的技术难度并不大,技术手段主要有流量的制造、流量的标记、测试数据的处理,全链路压测的架构如下图所示。
制造流量就是制造真实的用户请求。这对读系统来说比较容易,只要发生HTTP GET 请求就可以,对写请求而言就需要构造数据了。例如下单操作需要填数量和收货地址等信息,因此需要有一个数据构造平台来构造符合业务流程的数据集合。电商系统的流量制造相对简单,只需要构造一些请求的URL 集合,再通过流量引擎令这些请求发生即可。
电商以外的系统像打车这种类型的系统,需要构建带有状态机的流量引擎来制造流量。
流量的制造除了要能够控制流量大小外,还要注意流量发起所在的物理网络位置最好能保证流量是从不同的地理位置发起的,流量发起端可以部署在各地的CDN 节点中,并把不同的网络运营商也考虑进来,这样能更好地模拟真实的用户请求
流量制造出来以后,需要做标记,因为它们属于测试流量,它们的数据是测试数据,不能和线上的真实数据混同。
标记流量有多种方式:
一种是设计不同的数据。
例如商品数据的商品 ID 都以 9999开头、把订单 ID 设置在某个特殊的区段内;
第二种是给每个请求贴上一个 trace 标签。
每个系统调用的地方都能识别出这个标签,一方面可以做一些特殊处理,如取消 token验证,另外一方面也可以把它路由到特殊的数据表中。
trace 的传递是一个难题,最好的方式是通过中间件来完成:从最外面的 HTTP 协议将 trace 添加在 Header 中,到应用的 RPC 调用中也可以加到协议头中,再到数据层中也一样,最重要的是要保证 trace 标签不能被丢掉否则将出现脏数据。
对测试数据的处理是最关键的环节,因为是线上真实生产环境的压测,所以对产生的数据的处理不能影响线上的真实数据。对此,我们提出影子表的概念,它和线上的真实表完全一样,甚至和真实表一样用在同一个数据库实例中,通过传递下来的trace 标记把这个请求需要写的数据路由到影子表中,这样测试流量的读写都在影子表中完成,不会影响线上的真实数据。将测试数据通过影子表来隔离是非常关键的,如果放在一起会引起很多麻烦,也不好清理,即使能够清理也会影响正式表的主键生成规则,影响下游 BI对数据的分析和一些监控指标的展示等。
线上发压(压力测试)工具平台多种多样,它们为开发者和运维团队提供了方便的方式来评估系统的性能和稳定性。这些工具和服务可以分为开源工具、商业解决方案以及云服务平台提供的服务。
Apache JMeter
支持多种协议,包括HTTP、HTTPS、FTP、JDBC等。
提供图形用户界面,易于使用,拥有庞大的社区支持。
Locust
Python编写的分布式负载测试工具,易于扩展和定制。
支持基于浏览器的实时监控面板。
Gatling
Scala编写,专注于高性能和易用性。
生成详细的HTML报告,便于分析测试结果。
k6
Go语言编写,轻量级且高效。
内置了丰富的API用于创建复杂的测试场景,并提供云端执行选项。
wrk
一个现代的HTTP基准测试工具,以其速度和灵活性著称。
适合快速进行简单的压力测试。
阿里云性能测试服务PTS (Performance Testing Service)
支持HTTP/HTTPS、WebSocket、TCP、UDP等多种协议。
集成了丰富的监控指标,能够帮助用户快速定位问题。
华为云性能测试服务CPTS (Cloud Performance Testing Service)
类似于阿里云PTS,但可能在价格上更具竞争力。
提供了较为经济的选择,满足主要压测需求。
睿象云的云压力测试平台CPT (Cloud Pressure Testing Platform)
主要面向运维服务,可与其他产品如告警与监控服务搭配使用。
LoadRunner (Micro Focus)
业界知名的商业负载测试工具,支持广泛的协议和技术。
提供全面的分析功能,适用于复杂的企业级应用。
BlazeMeter
基于JMeter的云服务,简化了大规模并发用户的设置过程。
支持自动化CI/CD集成,提供了详尽的性能分析。
协议支持:确保所选工具支持你要测试的应用程序使用的协议。
并发能力:根据预期的用户量选择能产生足够并发请求的工具。
资源消耗:了解不同工具在运行期间对系统资源的需求。
易用性和学习曲线:评估工具的学习难度和操作便捷性。
成本效益:比较各工具的成本,找到性价比最高的方案。
社区和支持:考虑是否有活跃的社区或者专业的技术支持。
根据你的具体需求和技术栈,可以选择最适合的工具来进行线上发压测试。
实施一个高可用压测体系通常可以按照以下步骤进行,这些步骤旨在确保测试的有效性、准确性和可重复性:
明确目标:确定你希望通过压力测试达到的目标。这可能包括评估系统的最大负载能力、响应时间、并发用户处理能力等。
定义成功标准:设定性能指标(如平均响应时间、每秒事务数)和故障容忍度作为成功的衡量标准。
复制生产环境:尽可能地创建一个类似于生产环境的测试环境,以确保测试结果具有代表性。
配置监控系统:部署必要的监控工具来收集关于CPU、内存、磁盘I/O、网络流量等方面的数据。
选择测试类型:根据需求选择适当的测试类型,比如负载测试、峰值测试、持久性测试、故障恢复测试等。
设计测试用例:编写具体的测试场景,包含预期的操作流程、输入数据、期望的结果等。
准备测试数据:准备好用于测试的大规模数据集,尽量模拟真实世界的使用情况。
选择合适的工具:根据测试需求选择适合的压力测试工具,例如JMeter、Gatling、Locust等。
编写测试脚本:使用选定的工具编写或录制测试脚本,确保能够自动化执行所有预设的测试用例。
小规模试运行:先在一个较小规模上运行测试,检查测试设置是否正确,同时调整任何发现的问题。
优化测试脚本:基于初步测试的结果,对测试脚本进行必要的优化,以提高效率和准确性。
逐步加压:从较低的负载开始,逐渐增加直到达到极限值,观察系统的反应。
记录测试过程:详细记录每个阶段的测试参数、结果以及出现的问题。
数据分析:利用统计方法和可视化工具对收集到的数据进行深入分析,识别潜在问题点。
撰写报告:编制详细的测试报告,总结测试发现,并提出改进建议。
实施整改措施:根据测试报告中的建议,采取措施改进系统性能或架构。
验证改进效果:再次进行测试,确认整改措施是否有效提高了系统的性能和稳定性。
定期回顾与更新:随着业务和技术的发展,定期重新评估和更新你的压测策略,保持其相关性和有效性。
以上步骤构成了一个完整的压测体系实施框架。实际操作中,可能会根据特定项目的需求和资源情况进行适当调整。
阅读后若有收获,不吝关注,分享,在看等操作!!!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。