tmerclub-doc/基本开发文档/mall4cloud商城压力测试报告.md

242 lines
8.8 KiB
Markdown
Raw Normal View History

2025-03-20 17:43:07 +08:00
## tmerclub商城压力测试文档
2025-03-19 15:04:57 +08:00
## 一、测试工具
##### **工具**使用阿里云性能测试PTS分别进行单机集群负载均衡测试性能测试PTS参数相如下
![image-20220527171857399](../img/基本开发文档/压测/订单接口配置.png)
![image-20220527171857399](../img/基本开发文档/压测/PTS参数.png)
## 二、测试-普通订单
### 单机部署压测报告:
#### 服务器列表:
- 总服务器*18核32g
- RDS数据库*18核16g
#### 压测报告
![image-20220527180311734](../img/基本开发文档/压测/订单/单机/压测报告.png)
- 每秒事务处理量tps平均/峰值) 440/502
- 成功率(请求/业务100%
- 平均RT业务响应时间ms910
- 异常数(请求/业务) 0/0
- 总请求数5.2w
#### RDS数据库*1
**CPU使用率%**18%
**内存使用率(%**20%!
#### 压测结果分析:
提交订单的处理流程分为以下几步:
- 提交订单-锁定并更改sku库存、插入数据到MySQL
- Canal监听MySQL数据库binlog,发送数据变动的mq
- 服务消费mq将订单数据同步到Elasticsearch(用于搜索)和MongoDB(订单分库分表后,用于数据统计)
因此在单机部署的环境中Canal、RocketMQ、Elasticsearch和MongoDB等中间件会消耗一部分服务器性能
同时也限制了订单服务的性能。
### 集群部署压测报告:
#### 服务器列表:
- 中间件服务器*18核16g
- 后端接口服务器*18核32g- 服务器配置随订单服务部署数量增加而提升, 仅测试提交订单接口,其他服务性能维持在不影响订单服务即可
- 订单服务机器4核4g1-8台
- RDS MySQL数据库8核16g1-4台
- RDS Redis数据库1GB
#### 压测结果列表
| 订单服务数量 | TPS平均/峰值) | 异常数(请求/业务) | 总请求数 | 成功率(请求/业务) |
| :----------: |:----------:| :-----------------: | :------: | :-----------------: |
| 1 | 682/769 | 0/0 | 8.1w | 100%/0 |
| 2 | 1311/1502 | 0/0 | 15.4w | 100%/0 |
| 4 | 2820/3022 | 0/0 | 33.5w | 100%/0 |
| 6 | 4151/4638 | 0/0 | 49.4w | 100%/0 |
| 8 | 5526/6145 | 0/0 | 65.7w | 100%/0 |
#### 压测结果分析
压测结果列表中的数据为:订单服务性能在不受中间件和其他服务影响下的压测报告
**提交订单流程使用到的服务列表**
- 订单服务 - 提交订单接口所在服务
- 商品服务 - 锁定并扣除sku库存
- 鉴权服务 - token检验并获取登录用户的信息
- 搜索服务 - 消费mq同步订单数据到Elasticsearch和MongoDB
- 用户服务 - 同步订单数据中,插入更多下单用户的信息,便于后续的搜索与统计
**提交订单流程使用到的中间件列表**
- MySQL - 存储订单及订单相关的数据
- Canal - 监听MySQL数据库binlog,发送订单数据变动的mq
- RocketMQ - 消息中间件
- Elasticsearch - 通过搜索服务同步订单数据用于订单列表查询
- MongoDB - 插入sku出库记录、通过搜索服务同步订单数据用于订单数据统计分库分表后统计方案
**分析**压测过程中以上中间件和服务都维持在不影响订单服务的性能。压测8个订单服务的情况下以4核4g服务器为标准
除了商品服务的部署数量为2其他服务部署数量是一台且都没有达到上限
订单模块分库分表后为8个数据库且8个订单数据库都放置在一台MySQL订单服务部署数量为4的时候达到上限压测数据为
![4*订单-mysql上限](../img/基本开发文档/压测/订单/4/压测报告.png)
新部署一个mysql并将四个订单的数据库迁移过去一共两个MySQL,每个MySQL分别包含四个订单的数据库, 再次压测:
![4*订单-mysql上限](../img/基本开发文档/压测/订单/4-2/压测报告.png)
增加一台MySQL后数据库的性能不再是限制同时TPS增加300又回到平均范围,继续增加订单服务部署数量到8台:
![4*订单-mysql上限](../img/基本开发文档/压测/订单/8/压测报告.png)
此时数据库性能又达到了上限继续增加MySQL数量后
![4*订单-mysql上限](../img/基本开发文档/压测/订单/8-3/压测报告.png)
由以上压测流程可知一台阿里云RDS MySQL数据库对应四个订单服务(四核4g)时达到瓶颈后续通过增加MySQL数量来继续部署更多的服务。
## 三、测试-秒杀订单
### 集群部署压测报告:
#### 服务器列表:
- 中间件服务器*18核16g
- 后端接口服务器*18核32g- 服务器配置随秒杀服务部署数量增加而提升, 仅测试秒杀订单接口,其他服务性能维持在不影响秒杀服务即可
- 秒杀服务机器4核4g1-8台
- RDS MySQL数据库8核16g
- RDS Redis数据库1-8 GB
#### 压测结果列表
| 秒杀服务数量 | TPS平均/峰值) | 异常数(请求/业务) | 总请求数 | 成功率(请求/业务) |
|:------:|:-----------:| :-----------------: |:------:| :-----------------: |
| 1 | 2537/2790 | 0/0 | 30.2w | 100%/0 |
| 2 | 5079/5263 | 0/0 | 60.4w | 100%/0 |
| 4 | 9892/10202 | 0/0 | 117.7w | 100%/0 |
| 6 | 14389/14895 | 0/0 | 165.4w | 100%/0 |
| 8 | 18608/19436 | 0/0 | 221.4w | 100%/0 |
#### 压测结果分析
压测结果列表中的数据为:订单服务性能在不受中间件和其他服务影响下的压测报告
**秒杀订单流程使用到的服务列表**
- 商品服务 - 保存sku出库记录(异步),不直接影响秒杀性能
- 鉴权服务 - token检验并获取登录用户的信息
**秒杀订单流程使用到的中间件列表**
- Redis(开启aof) - 存储订单数据(提高下单性能)后续再插入MySQL(异步)
- RocketMQ - 消息中间件
- MongoDB - 存储sku出库记录
秒杀服务部署8台服务器后Redis性能达到瓶颈压测数据为
![8*订单-redis上限](../img/基本开发文档/压测/秒杀压测/8/压测报告.png)
新部署一个Reids, 再次压测:
![8*订单-redis上限](../img/基本开发文档/压测/秒杀压测/8-1/压测报告.png)
增加一台Redis后两台redis的cpu使用率都是50%~60%。
**分析**网关和鉴权服务的性能会影响秒杀订单性能商品服务是异步保存sku出库记录
因此不跟秒杀服务部署在同一台机器就不会影响秒杀性能,
秒杀订单数据存储在redis中当redis性能达到瓶颈时可增加redis的部署数量来继续提高秒杀订单性能。
## 四、压力测试结果
以如上机器配置和条件,订单分别进行集群和单机进行下单的压力测试最终结果无Error产生JVM运行正常没有出现Jvm异常的情况。
### 普通订单
**单机部署压测结果**机器吞吐量维持在440/502并发在这种大量并发请求时场景响应时间平均为910ms
**集群部署压测结果**
- 提交订单TPS: 682/769
- 八台订单服务机器TPS: 5526/6145
- 压测过程中成功率100% 异常数量为0
- MySQL、其他服务和其他中间件不影响订单服务性能的情况下增加订单服务部署数量TPS也对应服务数量倍增
- 商城默认分库数量为8可以对应8台MySQL, 订单服务数量是32也就是八台MySQL都达到瓶颈时TPS为: 2w(680*32)
- 默认分库性能达到瓶颈,通过增加分库数量,以继续实现性能的提升(分库数量可以通过配置扩容,不需要更改代码,但旧数据需要根据分片规则手动迁移到新数据库)
### 秒杀订单
**集群部署压测结果**
- 秒杀订单TPS: 2537/2790
- 八台订单服务机器TPS: 18608/19436
- 压测过程中成功率100% 异常数量为0
- 增加秒杀服务数量TPS也对应服务数量倍增
- TPS为`1.8w`时Redis达到瓶颈增加redis部署数量可继续提升秒杀订单性能
**综合以上结论**
1. 在Linux服务器上运行时集群会比单机的并发性能要高服务性能根据服务数倍增。
2. 服务的性能会受其他服务性能的影响,所以增加压测服务的数量时,与之相关的服务也要对应增加。
3. 秒杀数据直接存储于Redis中而普通订单的提交是存储到Mysql且有多个关联表也就是会多次连接mysql进行插入操作所以普通订单下单的性能低于秒杀订单下单。
4. 我们再仔细观测在所有的测试环节内存占用并未出现过明显提高的情况所以推荐购买服务器时更需要注重CPU的性能与核心数。