1. 前言
通过之前的学习,我们已经掌握了crank的配置以及对应http基准工具bombardier、wrk、wrk2的用法,本篇文章介绍一下如何将其用于实战,在实际的项目中我们如何使用crank来完成压测任务。
2. 项目背景
目前有一个项目,我们希望通过压测来了解其QPS、吞吐量、以及临界值,并通过压测来分析出其瓶颈在哪里?并通过解决瓶颈问题以提高QPS、吞吐量等指标
先看下我们手头掌握了什么:
- 项目信息
- 项目中的接口基本都需要登录
- 通过与开发沟通可以得到每个页面的接口信息以及参数信息
- 环境信息
- 压测项目有单独的环境部署应用、Redis、数据库等基础配置
此处项目名我们暂定为ProjectA。
3. 如何开展
首先我们先回顾一下Agent、Controller的职责以及特点
- Controller
- 做任务调度以及结果输出
- 无需单独服务器,可以在本机执行发送命令,需要与Agent相通
- Agent
- 任务的实际执行者
- 单任务执行,不能做到接收到多个任务并同时执行,先收到哪个任务,哪个任务会先执行
- 相同一个任务可以被多个Agent同时执行,最终指标结果会自动累加,可以通过提升Agent来模拟更高的并发能力
3.1. 思路
- 先做好单独接口的压测,大概掌握每个接口的指标情况
- 同时压测多个接口,完成对场景的压测
- 通过压测观察应用服务器、基础服务器的CPU、带宽、内存等指标,观察Redis、数据库、消息队列等基础组件情况,根据压测的返回结果得到每个场景的基础指标
- 通过分析发现瓶颈、然后再考虑如何突破瓶颈,提升QPS、吞吐量等
3.2. 如何做?
了解到单个Agent同时执行多个任务会进行排队,无法做到多任务同时执行,那么我们可以通过多个Agent同时执行不同的任务来模拟用户访问页面。
3.2.1. 构建Agent
之前与开发沟通得到每个页面最多可发送的请求是6个,那么我们准备6个Agent,分别为Agent1、Agent2、Agent3、Agent4、Agent5、Agent6
我们这里使用Docker来启动Agent、Agent对内开放端口: 5010、对外端口随机,镜像使用我们自建的: doddgu/crankagent:net5.0
并新建load.yml为之后压测使用:
profiles:
crankAgent1:
jobs:
load:
endpoints:
- http://localhost:5010
crankAgent2:
jobs:
load:
endpoints:
- http://localhost:5011
crankAgent3:
jobs: