面向5G新应用的压力测试工具快速开发与部署实践
点蓝色字关注“中移科协”
随着5G新技术为代表的新一代信息技术加速融入经济社会民生,这一过程将不断催生新业态新模式的5G产品。5G新应用已在社会各个行业领域得到广泛应用,高并发的场景给业务系统带来严重的负荷。如何确保业务系统高质量、高效率承担大量用户带来的访问压力,是软件服务企业需要关注的重要内容。
目前,业界主要采用Loadrunner与Jmeter两种压力测试工具对系统开展压力测试,以确保业务在高负荷下的性能表现。
Loadrunner是目前业界主流的一款商用压力测试工具,可用于预测系统行为和性能的负载测试,通过生成代理和虚拟用户来模拟业务流程和真实用户的操作行为,对业务系统实施高并发负荷并进行实时性能监控以确认和查找问题。该工具主要特点为运行稳定,监控指标齐全,测试结果细致,但存在价格昂贵、安装流程繁琐、Linux压力机部署困难等主要缺点。
Jmeter是一款优秀的开源压力测试工具,可用于对服务器、数据库、网络或对象模拟巨大负载来测试其负载能力与整体性能。该工具基于Java语言开发,具备丰富的逻辑控制器与监控组件,但断言机制较为简单,且运行依赖于Java环境,自身资源消耗受Java语言性能影响较大。
综合以上原因,中移互联网有限公司研发了一种基于Golang语言新型的压力测试工具,对以上两种工具的不足之处进行补充,并将此工具应用到生产活动中,在中国移动内开展一系列5G新应用的压力测试实践。
一、使用GO语言进行压力测试的优势
Golang语言是谷歌公司开发的一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言,使用Golang开发压测性能工具具有语言效率高、资源消耗低、开发维护成本低、协议支持丰富等优势。
1.1、在资源消耗上,开源工具如Jmeter工具,由于使用Java语言开发,语言本身的性能不高,在开展高并发压力测试时,自身资源消耗较大,所需服务器资源随着并发数的增加存在资源瓶颈问题。压测工具使用Golang开发,Golang的语言效率高于Java,且原生支持多线程。因此使用Golang开发的压测工具先天具有比Jmeter更好的资源利用性能与并发性能。
1.2、在使用便捷上,Jmeter部署需要JDK环境与依赖包以及整个Jmeter程序和参数数据等内容,自研压测工具只需要一个可执行文件即可完成压测。实际测试实践中,被测接口有较多变化参数,不同接口之间也存在复杂的逻辑关系,因此Jmeter难以胜任接口交互方面的压测,除非自行编写很多复杂的插件。而使用Golang开发的压测工具能处理复杂的参数和逻辑关系。
1.3、在投入成本上,商业工具例如LoadRunner,因为价格较高且需要较高的维保费用,也无法满足日常工作的正常开展。
1.4、在协议支持上,使用Golang开发的压测工具对网络协议没有限制,可支持HTTP、原生TCP、WebSocket等所有常见协议。
二、压力测试工具介绍
2.1、系统设计
该压力测试工具主要由输入层、控制层、输出层三个层级组成,系统架构如下图所示。
基于Golang的压力测试工具系统架构示意图
2.1.1、输入层
输入层以配置文件的形式,为本工具提供目标请求路径、压测模型、并发请求数、并行线程数、测试持续时间与统计日志格式等主要参数。在本工具中,配置系统以json文件格式进行保存,输入层在系统执行任务时,根据指定文件名读取对应配置文件后,将各参数传递给控制器。本工具配置文件格式参考下图。
压力测试工具配置文件示意图
2.1.2、控制层
控制层是本工具的核心组件,承担参数传递、并发生成、任务调度、日志采集等核心功能,具体分为以下3个方面:
(1)生成器:从输入层获取配置参数,将配置参数传递至生成器,由生成器调用Goroutine模块生成指定数量的并发请求;
本工具的生成器基于Golang语言的Goroutine进行开发。Golang语言原生支持并发编程,Goroutine是其最基本的执行单元,相比Java语言的线程具备资源开销小(每个Goroutine默认仅占用2KB内存,Java语言的线程默认占用8MB内存)、调度性能好等优点。生成器从控制层获取配置参数后,根据参数信息生成对应数量的Goroutine实现并发请求,并交由测试单元执行测试。
(2)测试单元:将配置参数传递至测试单元,由测试单元利用生成器产生的并发请求,对测试模型发起并发访问测试,并将测试数据存储于Channel模块;
测试单元是本工具的主要测试模块,组成内容包括接口地址、接口响应逻辑、响应数据记录等。测试单元支持动态调整,可根据不同的测试对象配置不同的测试单元,利用生成器产生的高并发请求,向测试对象对应的接口地址发起访问。被测接口接收请求后,根据业务逻辑进行处理并返回响应数据,测试单元接收响应数据并保留响应时间、响应信息、错误信息(如有)等主要数据后,将其发送至Channel。
(3)统计器:读取存储于Channel内的测试数据,按指定格式生成日志文件。
统计器基于Golang语言的Channel类型进行开发,主要用于并发核心单元的数据通讯,其特点在于从多个Goroutine往同一个Channel中发送数据时,不需要考虑额外的同步措施,即由生成器产生的高并发请求所带来的测试数据均可准确存储于Channel中。在统计器调度下,工具读取存储于Channel中的测试数据,按指定格式生成日志文件。
2.1.3、输出层
测试数据返回后,进入分析器进行分析,将接口平均响应时延、CPU平均占用比例和峰值、内存使用率和峰值、网络流量流入/流出进行统计和展示,可在配置器中进行分析设置,一般设置各项性能指标的95分位和99分位开展结果分析,以评估系统在高并发压力测试过程中的系统承载能力。
2.2、效果分析
本工具应用于公司中间号与顺丰、58、百世、德邦、美团等多家企业的联合压测项目中,能高效准确地解决开发过程中遇到的压力测试问题,协助中间号平台将平均性能从开始的500TPS提升到至10000TPS以上,大幅超过客户的预期。以中间号对接顺丰接口压测为例:
(1)在本次测试使用1000TPS并发量进行测试,共发送请求10749954次,全部成功返回。
(2)测试持续三小时(2020-06-30 10:53:46至2020-06-30 13:53:45)。
(3)压力机到被测服务器的平均Ping值为6ms。
(4)测定方式为使用指令:ping -t 8.129.182.70 -n 100。
(5)平均响应时间为:14.22ms,忽略网络延时影响影响时间为:8.22ms。
(6)99分位请求响应时间为:34ms,忽略网络延时影响影响时间为:28ms。
(7)95分位请求响应时间为:21ms,忽略网络延时影响影响时间为:15ms。
测试过程中,平均响应时间情况如下图所示。
中间号顺丰接口压测结果
三、结语
综上所述,基于Golang语言开发的压测工具具有语言效率高、资源消耗低、开发维护成本低、协议支持丰富等优势。该工具具备输入-控制-输出三大模块的架构,能有效地支撑中间号等业务平台与接入企业的联调任务,其高效、可定制的输出能帮助业务精准找到系统性能瓶颈并加以优化。该工具原计划由第三方机构支撑开展,成本25万人/年,共6人,总成本预计每年150万,现由公司自有团队独立开发,将成本降为一年25万左右,为公司每年节约成本125万。测试效率方面,解决了Jmeter等开源压测方案需要JDK环境、依赖包、插件多的痛点,仅需一个可执行文件即可完成压测,极大地提高了测试的时间与资源效率,有效助力公司5G新业务蓬勃发展。
— end —
作者:IT学部-黎伟健
往期精彩内容,戳我
更多精彩视频
会化学=会魔法
防手抖的勺子,帕金森患者的福音
据说每一个点【在看】的人都收获了好运👇