基于Locust 的Web 性能测试工具设计

作者: 王永倩 贾秀玲

基于Locust 的Web 性能测试工具设计0

摘要:随着Web应用的普及和用户对响应速度要求的不断提升,确保Web应用在高并发环境下的性能成为开发过程中的关键环节。为了更高效地对Web应用进行性能测试,文章设计了一种基于Locust框架的Web性能测试工具,旨在通过分布式架构实现多台测试机同时施压,达到真实有效的高并发目的,通过软件方式解决传统测试中资源消耗占用率高的问题。文章结合Web开发技术将性能测试结果以可视化图表进行实时展示,支持关键指标图表联动,方便用户进行数据分析。该工具支持HTTP/HTTPS协议的Web应用测试,支持梯形场景设计,同时结合操作系统和中间件的性能监控指标,利用Prometheus和Grafana构建实时监控体系,实现对Web应用服务响应的全方位监控与分析。经过测试,该工具具有良好的可行性和实用性。

关键词:Web应用;Locust;性能测试;可视化图表;全方位监控

中图分类号:TP311 文献标识码:A

文章编号:1009-3044(2024)27-0008-04

0 引言

软件作为信息化时代的重要载体,尤其是商业软件日用户量巨大,上线之前必须经过性能验证,否则容易引发服务宕机、软件崩溃等问题。用户操作逻辑是用户与Web应用交互的核心,其合理性和效率直接影响用户体验和应用性能[1],因此将性能效率风险贯穿于软件方案论证、软件设计研发及软件产品交付整个过程中具有重要意义。

目前市场上已有很多Web性能测试工具,但使用较多的高并发工具主要有收费的LoadRunner和开源的JMeter。社区版本LoadRunner只能满足模拟极少数用户并发,且不能用于商业用途;商业版本Load⁃Runner能够模拟大量用户并发,但工具价格昂贵、操作复杂且可移植性不强[2]。JMeter是一款开源性能测试工具,JMeter通过线程组来驱动多个线程运行测试脚本对被测服务器发起负载[3],可通过修改配置文件实现施压机级联,但对用户来说操作比较烦琐,测试效率不高。除上述两种常见工具外,不少企业尝试自研测试工具,如文献[4]提出了一种基于FabanPlus工具的Web软件性能自动化测试方法,但缺少监控手段和可视化展示。本文设计了一种基于Locust框架的Web性能测试工具,该工具通过分布式架构实现高效的并发请求生成与调度,并将测试结果以可视化图表进行展示。同时结合操作系统和中间件的性能监控指标,利用Prometheus和Grafana构建实时监控体系,可以实现对Web应用服务响应的全方位监控与分析。

1 Locust 简介

Locust框架是一款使用Python编写的开源性能测试工具,主要应用在分布式测试、API压力测试、性能瓶颈识别、负载能力评估以及Web应用性能测试。它以其易用性、可扩展性、实时监控和高度可定制等优势,目前已经被众多开发测试人员用于大型系统的复杂压力测试。随着云计算和微服务架构的普及,Lo⁃cust在分布式系统和API性能测试方面的优势将更加明显,其在性能测试领域的地位也将进一步提升。Locust相比其他基于进程和线程的测试工具,摒弃了系统级资源调度,采用协程(gevent) 来实现高并发。这使得Locust在单机上能够产生更高的并发请求数,同时保持较低的资源消耗。其主要特点包括:使用普通Python脚本定义测试场景,具有基于Web的用户界面以实时监控脚本运行状态。

2 工具总体架构设计

本设计共有6个功能模块,其中并发引擎是核心,负责整个软件的运行调度、数据计算。由并发引擎发起模拟请求,直接向服务器施加压力,接收服务器返回的响应数据;仿真录制用于获取用户对被测软件任意操作的快照信息,将请求以脚本的方式传递给并发引擎,由并发引擎发起模拟行为;场景设计为高并发测试用户提供场景设计接口,由用户确定并发用户数、启动模式、持续时长等关键场景信息;负载设定用于设置资源信息以及每台压测机发起的事务比例。并发引擎获取负载设定传入的参数后,根据该参数进行任务调度;数据处理主要能力在于将并发引擎反馈的数据做进一步处理,生成TPS等指标信息,对测试过程数据进行存储,为性能分析提供基础数据;可视化显示部分是基于Web技术研发的数据展示页面,将指标数据和过程数据以直观的方式向用户进行呈现;监控系统主要是通过软件探针抓取资源使用数据并以图表的方式展示,该部分支持自定义模板设置。图1 为工具总体架构图。

3 工具功能设计

3.1 仿真录制

仿真录制是实现用户行为模拟的重要环节,其核心是对基于HTTP/HTTPS协议的Web应用进行网络数据监听。为了实现网络数据截取,首先要配置proxy网络代理,并为该代理指定代理端口,使用Fiddler对指定端口上的数据进行捕获。本设计基于Chrome浏览器实现,启动仿真录制服务后,fzService服务会接收Fid⁃dler获取的数据包,并按照Har标准协议编排。通过仿真录制服务可以收集用户在Web应用上的任何行为,包括该行为背后客户端和服务端之间的请求头、响应头、响应体、Cookie、时间戳等所有网络信息。

本设计基于HTTP/HTTPS 协议进行Web应用录制。其中HTTP协议采用明文传输,可以直接查看报文详情。HTTPS协议采用双向加密后,Fiddler以中间人身份获取报文后,由于没有密钥,无法直观查看报文信息。对于HTTPS协议,由于加密原因并不是完全无法获知明文,可以在加密通信建立之前,获取服务器中含有证书的报文,并替换该证书后发送给客户端。收到客户端包含密钥的对称加密报文后,以服务端公钥完成加密发送给服务器,如此相当于获取解密后的服务数据,接下来便可以对相应的报文信息进行保存和修改。

录制结束生成Har文件后,便可以进行网络重放,验证录制到的网络信息是否与用户的操作行为一致。

3.2 负载设定

由于性能验证在高并发压力下进行,施压机对于CPU、内存以及带宽的需求比较大,因此需要将请求分配到多台施压机上,以此来完成压力测试。将需要的服务包上传到指定的两台施压机,完成服务安装,并设定好主从关系。本文将负载的worker(辅助进程)指向负载master(主进程)的IP即可,主从进程通过消息参数完成主从节点间的跨节点通信。当主从机上的任务启动时,服务会对仿真录制的Har文件进行解析,进而按照脚本中定义的串行事件进行执行。任务执行时,系统支持权重设置,来调节每个机器上运行的事务数。

3.3 并发场景设计

性能测试聚焦于通过模拟特定场景下的压力活动,旨在达成预设测试目标。性能测试中的场景设计是实施性能测试的基础,场景设计一般在录制脚本完成后进行[5]。并发场景设计以梯形模式、线性模式、震荡模式最为常见,涉及的主要参数有并发用户数、login session间隔以及运行总时长。

本设计高并发场景为梯形模式,用户可根据实际使用需要设置用户并发量、用户增长间隔以及运行时长。用户增长间隔默认为秒,当用户输入并发用户数和用户增长所需时间后,后台服务自动计算每秒上线的用户数。用户一旦上线完成,按照脚本中的请求顺序执行并发任务,模拟用户运行到设定的执行时间后,自动退出。本设计并发引擎基于Python语言的gevent、requests等库文件,参数化可通过在相应的请求事务节点,用户根据场景设计需要以Python代码方式完成。

在场景设计中,需要对系统的平均并发用户数进行估值,估值公式如式(1) :

C = nL/T (1)

式中,C 代表平均并发用户数,n 代表login session 的数量,L 代表login session完成该事务的时长,T 代表运行的总时长。

获取平均并发量后可以按照该值进行峰值并发量估算,估值公式如式(2) :

式中,峰值并发量用D 来表示。该估值的前提是login session按照泊松分布产生。

对于响应处理能力,通常使用的是TPCC估值,该估值计算的是系统每分钟处理的请求个数。实际上,该指标也是衡量服务器处理能力的一个重要参照。

该估值体系充分考虑了软件实际运行中的并发用户数、用户访问模式、软件处理的事务中各个业务占比、经验系数以及服务器必须保留的冗余比例。

3.4 并发引擎

本设计并发引擎依赖于Locust框架的gevent库,该库提供了丰富的二次开发接口,主要能力在于底层的greenlent微线程机制,按照传入的参数发起所需协程,协程最大的特点是支持单机高并发量。LoadRun⁃ner和JMeter使用的是线程机制,线程是操作系统级别的并发执行单元,每个线程拥有自己的执行堆栈和程序计数器,由操作系统内核管理。线程是重量级的执行单元,其创建和切换成本相对较高,因为涉及系统级的上下文切换。协程的切换速度比线程快10倍左右,协程是程序级别的执行单元,运行在线程之上,由程序控制而不是由操作系统内核管理。协程是轻量级的,其创建和切换成本非常低,协程的切换是在用户级别进行的,不需要系统级的上下文切换。在协程内由代码控制运行逻辑,因此可控制协程在频繁I/O 处理时暂停而不至于将线程阻塞。

本设计集成了Python的requests库以支持HTTP 与HTTPS协议的访问控制,确保网络交互的广泛兼容性和安全性。同时使用pyzmq库实现服务的分布式部署,允许服务跨越多个机器或进程并发运行。面对高并发请求场景,系统后台依据用户定义的主从关系策略,通过pyzmq动态启动引擎服务,并借助gevent库的协程机制,在并发脚本中高效地执行HTTP/HTTPS 请求,从而在不增加额外资源开销的前提下,实现高并发事务处理。

3.5 数据处理

高并发执行过程中会产生大量数据。例如,在万级并发量的情况下,系统运行中每秒产生的过程数据量是用户量的几何倍数。在庞大的数据量下,测试工具采样频率和采样精度直接关系到性能效率结果的正确性。本文对TPS、RPS、平均响应时间等以秒为单位进行数据更新,即对于指标更新,在基于之前采样数据进行运算的基础上,一秒后重新运算并更新数据,防止频繁更新引起缓存以及CPU资源的浪费。对于复杂结构数据,计算精度按照规则做截断处理,指标项的数据精度只保留到小数点后5位。

高并发过程中产生的数据主要有三种:项目信息、过程数据和报告信息。数据处理模块对产生的数据进行分析统计,生成需要的指标信息。针对高并发效率验证的特点,本文对不同的数据采取不同的处理手段。项目信息在项目创建阶段将项目ID、项目名称等在数据库中进行存储,脚本信息则以索引的方式与项目进行关联。高并发过程中产生的动态数据如TPS、平均响应时间等使用Redis进行存储,项目结束后Redis自动清空。高并发过程中用于单个用户进行追踪的数据以及系统运行时产生的日志信息,该种数据的特点是数据量大、内存占用高,但对用户进行脚本调试、错误追踪、用户行为分析又必不可少。本设计中将该类数据以文件的方式直接在相应的施压机进行存储,避免频繁进行SQL连接,减少数据库连接和关闭的次数。通过文件方式查找过程数据在性能测试中相对更加便捷高效。高并发性能效率验证结束后,最终的TPS、RPS、平均响应时间、最大响应时间、最小响应时间、T50、T90等报告信息,在运行时长结束后,立即执行数据库操作,并将该数据与项目ID 进行关联。

3.6 数据监控系统

数据监控系统以Prometheus开源软件为中心进行结果展示。将操作系统、中间件Kafka、Redis等中间件以及数据库MySQL相应的pointer探针程序启动后,在Prometheus 的YAML 文件中进行配置,指向pointer 探针的IP 和端口以及程序名称。Prometheus 启动后便可以获取pointer探针采集到的监控数据,Prometheus将检测数据发送到Grafana软件页面进行数据展示。Grafana具备强大的界面显示能力,除了基础的数据展示外,还可供使用者进行二次开发,使用者按照自己的显示风格进行页面设计。

上一篇 点击页面呼出菜单 下一篇