目录

一、背景

二、工具选择

三、性能测试的具体实践

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)

压测过程示例:

微服务架构 测试 微服务测试工具_微服务架构 测试_02

当让你也可以查看更多的数据,比如:

  • RPS(Request Per Second): 每秒请求数的变化,它反映了吞吐量

微服务架构 测试 微服务测试工具_性能测试_03

  •  Response Time 响应时间的变化

微服务架构 测试 微服务测试工具_性能测试_04

  • Number of Users, 用户并发数量的变化, 它反映了系统能承受的并发请求吞吐量

微服务架构 测试 微服务测试工具_测试工具_05

 除了CSV结果报告文件,新版本的Locust还支持了HTML的报告下载等,更加方便。

微服务架构 测试 微服务测试工具_性能测试_06

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 (蝗虫)-极客时间