极光笔记丨 Locust 性能测试工具的使用
作者:极光高级测试工程师——王素花 &杨莞武
1. 需求背景
通过介绍 locust 分布式负载测试工具的使用方法,让大家能快速掌握性能测试的基本方法,提高工作效率
2. 术语解释
性能测试定义:指通过自动化测试工具模拟多种正常,峰值以及负载条件对系统的各项性能指标进行测试
响应时间:测单接口的性能,响应时间可以简单理解为用户发送一个请求到服务器返回的响应数据这段时间就是响应时间。
并发用户数:某一物理时刻同时向系统提交请求的用户数,提交的请求可能是同一个场景,也可以是不同场景。
TPS: 全拼是 Transaction per second,每秒事务数;测单接口的性能,一个事务可以理解为一个客户机向服务器发送请求然后服务器做出反应的过程。
单推: 下发一条消息只推送一个用户 id (多个用户收到消息是通过推送多条消息来实现的)
多推:一条推送消息可以同时推送多个用户 id。(多个用户收到消息是通过一条消息来实现的)
3. 测试策略
3.1 需求分析:
针对需求,现需测试下列几个场景:
使用域名单推,查看发送的最大 TPS
使用域名多推,查看发送的最大 TPS
3.2 测试方法
1 、性能测试的前期准备:
分析业务场景:场景内容有哪些,范围较广,可与开发、产品,讨论确定本次测试的范围
分析测试策略:得到设计的测试场景有哪些
分析生产环境
选择测试工具:用什么方式来测试性能
2 性能测试的目的:
性能测试则通过提前模拟场景压力,发现系统中可能的瓶颈,进行系统调优,减少服务器宕机的风险
性能测试还可以用来评估待测软件在不同负载下的系统负载能力,为系统部署,提供性能数据决策
3 性能下降曲线分析法:
性能随用户数增长而出现下降趋势的曲线,如图所示:
蓝线表示 TPS,黄色表示响应时间
在 TPS 增加的过程中,响应时间一开始会处在较低的状态,也就是在 A 点之前。接着响应时间开始有些增加,直到业务可以承受的时间点 B,这时 TPS 仍然有增长的空间。再接着增加压力,达到 C 点时,达到最大 TPS。我们再接着增加压力,响应时间接着增加,但 TPS 会有下降。
3.3 测试工具
使用分布式压测工具 locust
3.4 测试环境
3.4.1 压测数据流程图
3.4.2 被测系统
API 服务为双机双节点部署方式,相关依赖服务部署也都部署在这台服务起上,且都是双节点
服务器资源:4 核 16G
使用域名压测:域名通过 lbs 转发到服务器
4 测试工具 Locust
4.1 简要
JMeter 和 LoadRunner 性能测试工具,是比较老牌的,都是通过线程来作为虚拟虚拟用户,而 Locust 是基于协程实现并发用户的,协程是比线程更小的单位,也称为子线程,在一个线程中可以运行多个协程。所以基于协程的 Locust,在进行分布式部署时,不仅可以进行多机压测部署,而且还可以在一台宿主机中完成
4.2 压测工具:locust,版本:0.14.5
4.3 Locust 本地宿主机部署步骤
1.首先我们需要通过 python+locust 写出程序需要运行的 ABC.py 文件
脚本说明:
新建一个类 TPush(TaskSet),继承 TaskSet,该类下面写需要请求的接口以及相关信息; self.client 调用 get 和 post 方法,和 requests 一样;
@task 装饰该方法表示为用户行为,括号里面参数表示该行为的执行权重:数值越大,执行频率越高,不设置默认是 1;
on_start 方法:当模拟用户开始执行该 TaskSet 类时,将调用该方法;
WebsiteUser()类用于设置生成负载的基本属性:
tasks:指向定义了用户行为的类;
min_wait:模拟负载的任务之间执行时的最小等待时间,单位为毫秒;
max_wait:模拟负载的任务之间执行时的最大等待时间,单位为毫秒。
2.创建 locust 运行的 master:
写好需要运行的 locust 文件之后,我们需要先利用命令“locust -f xxxx.py --master”创建一个 master,这个 master 不参与创建并发用户的工作,它主要是进行监听以及收集统计数据.
2.1 提供给 web 端,我们完全可以利用 python 当中的 os 的 system 函数直接编写出 cmd 命令进行运行
2.2 使用 no-web,也可以利用 python 当中的 os 的 system 函数直接编写出 cmd 命令进行运行
当然也可以直接输入命令执行
此时我们运行 py 文件,可以看到以下的信息,则说明我们已经启动了 locust 分布式的主节点 master
3.创建 locust 运行的 slave
我们就可以创建用于制造并发用户的分支节点 slave 了,方法就是复制 master 的文件,然后修改一下文件名称,一定要保证 slave 运行的文件与 master 文件是一样的,自己的机器有多少个 cpu 就可以弄多少个 slave,一般一个 slave 会使用一个 cpu 创建并发用户
ABC.py ABC_slave1.py 3.1 然后每个 slave 文件中需要在主函数中输入 cmd 命令
3.2 也可直接输入命令执行 slave
运行多个 slave,可以查看以下内容来判断分布式是否部署成功
当开启全部 slave 后,可以查看 master 的控制台信息,看到下面的信息则表示 locust 分布式部署成功了
4、打开 web 端同样也可以查看到分布式的 slave
登陆页面
启动压测前,需要填写用户总数(Number of total users to simulate)、每秒增加的用户数(Spawn rate)以及域名(HOST)。
每秒增加的用户数(Spawn rate)会在用户数达到用户总数(Number of total users to simulate)时停止增加。
查看 slave 节点数
由上图可以看出 slave 都存于 running 状态,且压力分布均匀。
测试结果数据下载
在 locust 当中使用 web 模式进行压测时是没有办法设定执行时间的,所以 web 模式下的压测会一直运行,直到点击 stop 才能运行,如果想在 web 模式下运行压测一段时间自动停止的话,那么需要在参数配置时加入 stop_timeout 参数即可,value 值是执行的时间(单位是 s)
class websitUser(HttpLocust):
task_set = Login #定义需要执行的任务集
min_wait = 1000 #最小等待时间
max_wait = 2000 #最大等待时间
stop_timeout = 60 # 停止的时间
5 通过 locust 可视化界面判断接口性能瓶颈
在总用户数为 100,每秒增加 1 个用户的情况下运行一段时间,我们查看 locustweb 界面:
发现 tps 稳定停留在某个数值(9.8),这时候我们点击 Charts 查看 TPS、延迟和用户数的详情分布图
可以看出在 TPS 在 10 之前,随着用户数的增加而增加;但增加到 10 之后,用户数再怎么增加 tps 依然稳定在 10 左右,只有延迟在增加;
再查看服务器性能
可以看出 cpu 都被该程序占用,那么我们可以初步认为该接口的 tps 为 10,且瓶颈在 cpu 上。
6.数据采集实操
单推接口:/single
多推接口:/mutiplie
7. 数据分析
压测时内存消耗没有 cpu 消耗明显。从系统稳定性考虑,需要考虑服务不挂,稳定情况下的性能指标。需要对数据采集进行分析,分析得如下结论:
单推:每秒增加用户数为 3,并发用户数为 160,cpu 消耗在 80%左右来持续压测得出下面的性能各项指标。
多推:每秒增加用户数为 2,并发用户数为 120,cpu 消耗在 78%左右来持续压测得出下面的性能各项指标。
注:(多推时,考虑到 body 的大小,deviceTokens 设置 3 个数,对接口来说无差异,在数据落地时才消耗资源,另外借助单推的经验和多推的系统逻辑,简单可以定位出多推的资源消耗。所以数据采集相对少些。)
8.测试结论
单推接口: 接口 TPS 压测结果为 1757/s,90%请求可以在 0.1 秒内响应,因线上 部署多台机器,所以该 tps 只限当前配置和部署的情况下,主要瓶颈是设备升级;
多推接口: 接口 TPS 压测结果为 1342/s,90%请求可以在 0.1 秒内响应,因线上部 署多台机器,所以该 tps 只限当前配置和部署的情况下,主要瓶颈是设备升级;
文章引用的数据,仅代表特定压测环境下的服务表现
版权声明: 本文为 InfoQ 作者【极光开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/f90c9482079cc08eb9f83fe93】。文章转载请联系作者。
评论