目录
一、背景
二、工具选择
三、性能测试的具体实践
1、使用Flask启动一个增删改查的在线服务
2、使用Locust开始性能测试
一、背景
在软件开发领域,有三点深入人心:
- 不能度量就不能管理
- 不能度量就不能证明
- 不能度量就不能提高
所以必须要有度量微服务性能的能力,而度量最有效的手段就是性能测试。性能测试目的主要是解决三个问题:
- 系统及服务能承受的最大负载是多少 ?
- 有没有性能平瓶颈 ?
- 如果有性能瓶颈,瓶颈在哪里?
这三个问题需要从测试的结果中分析得出,其中最重要的性能指标有三点:
(1)响应时间
(2)吞吐量
(3)成功率
二、工具选择
传统的性能测试工具有很多, 比如 Apache Bench、JMeter、LoadRunner 等等,它们都能用来持续增加压力。
不过,Apache Bench 之类的专用工具用来做简单的 HTTP 接口测试还行,如果需要做业务接口的串联测试就力有未逮了。
JMeter 当然功能强大,也有一定的扩展性,但在这节课我并不想用 JMeter , 原因有两点,一是因为 JMeter 是资源消耗黑洞, 每个任务 / 用户都要使用一个线程,二是因为 JMeter 是基于配置的。
相比之下,新一代的性能测试工具 Locust(蝗虫)是基于编程来实现测试用例的性能测试工具,它更加灵活。而且,它使用 Python 代码来定义用户行为,用写 Python 代码的方式来写测试脚本,远离了复杂的配置脚本和图形界面,利用强大而丰富的 Python 类库可以轻松支持各种协议,简单易用,扩展方便。
三、性能测试的具体实践
下面我们使用Locust工具来演示如何进行性能测试。
1、使用Flask启动一个增删改查的在线服务
这里以一个帐户管理的微服务为例,具体的代码可以查看:https://github.com/walterfan/mdd/blob/master/account/account_service.py,它是用 Python 基于 Flask 框架写的,模拟的是账户的增删改查接口。
1、下载代码
git clone https://github.com/walterfan/mdd.git
2、安装依赖,假设你已经安装好Python3,注意工作目录为./account
cd ./account
pip3 install -r requirements.txt
3、启动服务
python3 account_service.py
4、测试接口
(1)添加微博帐号
http --auth walter:pass --json POST http://localhost:5000/api/v1/accounts userName=walter password=pass siteName=weibo siteUrl=http://weibo.com
(2)获取所有账号
http --auth walter:pass --json GET http://localhost:5000/api/v1/accounts
2、使用Locust开始性能测试
Locust 要先写一个脚本文件 ,它就是模拟 HTTP Client 进行若干个 CRUD 测试,并且测试集选用 SequentialTaskSet, 通过 @task来指定测试用例的执行顺序
- 创建账户: POST /api/v1/accounts
- 检查账户: GET /api/v1/accounts/{accountId}
- 更新账户: PUT /api/v1/accounts/{accountId}
- 删除账户: DELETE /api/v1/accounts/{accountId}
locust对应的压测脚本实现:./accout/account_load_test.py,启动压测任务命令:
Ps:这个压测脚本依赖utils.py文件,注意在压测脚本的位置执行启动命令
locust -f account_load_test.py --web-host=0.0.0.0
打开:http://0.0.0.0:8089/,可视化的压测页面:
Ps:指定模拟的用户数(Number of users),以及孵化率(Spawn rate,每秒增加的用户数), 以及所要测试的服务器地址(Host)
点击“Start swarming”启动压测任务,可能你会觉得请求很慢,原因是 account_load_test.py文件中最下面的启动间隔时间设置的比较大,可以将wait_time = between(0, 10)改成wait_time = between(0, 0),如下所示:
#------------------------ simulate user to do testing ------------------------
class LocustTestUser(HttpUser):
tasks = [AccountTestSuite]
# wait_time = between(0, 10)
wait_time = between(0, 0)
压测过程示例:
当让你也可以查看更多的数据,比如:
- RPS(Request Per Second): 每秒请求数的变化,它反映了吞吐量
- Response Time 响应时间的变化
- Number of Users, 用户并发数量的变化, 它反映了系统能承受的并发请求吞吐量
除了CSV结果报告文件,新版本的Locust还支持了HTML的报告下载等,更加方便。
Locust 可以生成从测试工具这一客户端角度的性能测试报告,而我们在服务器端需要通过日志、内置的度量数据进行分析,根据 Locust 报告中记录的性能拐点、慢响应的 TrackingId,进行有针对性的分析。
三点需要注意:
- 第一点,在 Locust 生成的请求的 HTTP 头里需要带上 HTTP 头域 “TrackingId:$randomString”,并在服务器端的日志 Log 或度量 Metrics 中记录这一TrackingId,当某个请求响应时间非常慢,超过了设定的阈值,就会记录在测试工具的日志中,在后期分析的时候通过 TrackingId 和服务器端的相关日志以及度量数据关联起来,分析慢在哪里。
- 第二点,在 Locust 生成的请求的 HTTP 头里需要带上 HTTP 头域 “Authorization:$token”,代码只演示简单的 HTTP Basic 认证方式,现实世界中常用 OAuth Token 这一认证方式,Token (令牌)是有时效期的,所以需要用一个定时器在 Token 过期之前重新申请 Token。这个方法可以放在 "Account_Load_test.py" 的 on_start 方法中。
- 第三点,一台测试机器(或1个slave)产生的压力往往不够,注意一个slave最多占用一个CPU核,可以不断增加并发使用top命令查看CPU占用情况。我们可以使用Locust的分布式模式来实现发压,一个master server,若干个slave server,由master控制若干台slave server发起海量的请求。对应上述示例中的场景就是:
具体的内容可以参考:微服务性能测试利器 Locust (蝗虫)-极客时间