## mall4cloud商城压力测试文档



## 一、测试工具


##### **工具**：使用阿里云性能测试PTS分别进行单机，集群负载均衡测试，性能测试PTS参数相如下：

![image-20220527171857399](../img/基本开发文档/压测/订单接口配置.png)

![image-20220527171857399](../img/基本开发文档/压测/PTS参数.png)










## 二、测试-普通订单



### 单机部署压测报告：


#### 服务器列表：
- 总服务器*1（8核32g）
- RDS数据库*1（8核16g）

#### 压测报告

![image-20220527180311734](../img/基本开发文档/压测/订单/单机/压测报告.png)

- 每秒事务处理量tps（平均/峰值) ：440/502
- 成功率（请求/业务）：100%
- 平均RT（业务响应时间ms）：910
- 异常数（请求/业务） ：0/0
- 总请求数5.2w



#### RDS数据库*1：

**CPU使用率（%）**：18%

**内存使用率（%）**：20%!



#### 压测结果分析:

提交订单的处理流程分为以下几步：
- 提交订单-锁定并更改sku库存、插入数据到MySQL
- Canal监听MySQL数据库binlog,发送数据变动的mq
- 服务消费mq，将订单数据同步到Elasticsearch(用于搜索)和MongoDB(订单分库分表后，用于数据统计)

因此在单机部署的环境中，Canal、RocketMQ、Elasticsearch和MongoDB等中间件会消耗一部分服务器性能，
同时也限制了订单服务的性能。





### 集群部署压测报告：

#### 服务器列表：
- 中间件服务器*1（8核16g）
- 后端接口服务器*1（8核32g）- 服务器配置随订单服务部署数量增加而提升, 仅测试提交订单接口，其他服务性能维持在不影响订单服务即可
- 订单服务机器（4核4g）（1-8台）
- RDS MySQL数据库（8核16g）（1-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数量来继续部署更多的服务。



## 三、测试-秒杀订单

### 集群部署压测报告：

#### 服务器列表：
- 中间件服务器*1（8核16g）
- 后端接口服务器*1（8核32g）- 服务器配置随秒杀服务部署数量增加而提升, 仅测试秒杀订单接口，其他服务性能维持在不影响秒杀服务即可
- 秒杀服务机器（4核4g）（1-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的性能与核心数。
