Skip to content

正式环境性能测试

性能测试代码未找到打包方案,故在测试机器上 git clone 代码,并编译。脚本如下:

单实例测试

在 UCloud 上海B区跑,原因是UCloud上有钱。

运行环境

服务配置
PostgreSQL2C4G 20G RSSD 16.4 高可用版
BackendUbuntu 4C8G
Redis版本7.0 和backend同一台机器,docker部署
GatlingUbuntu 4C8G

backend镜像 redis host 配置无法生效,依旧指向本地,其余配置可生效,故Redis采用自建。

部署服务

sh
docker run -d --network=host --name=backend \
-v $(pwd)/application.yml:/server/config/application.yml \
ghcr.io/timzaak/hp-backend:0.0.1

# 国内可以用 ghcr.nju.edu.cn/timzaak/hp-backend:0.0.1 加速

测试结果

测试内容TPS/QPS75%响应时常(ms)错误率备注
1. 请求基准测试(300用户100次)6000(cpu 高峰 30%)5501 redis session check + 1 db query
2.请求基准测试(100用户100次)50001801 redis session check + 1 db query
3.下单基准测试 (100用户,500次)3125390数据库纯插入,无事务
4.下单纯数据库事务(10用户1000次)3571.43400.28用户只购买一款产品,类似秒杀
5.下单纯数据库事务(100用户500次)3333.33390.52用户只购买一款产品,类似秒杀
6.下单纯数据库事务(100用户500次)148.3710290.25用户只购买1~3款产品
7.拆分事务(100用户500次)97.4720160.23用户只购买1~3款产品
8.库存以内存为准,异步落库(100用户500次)3571.43370.06用户只购买1~3款产品

依据基准测试来看,除了6,7外,其余相差系数和本地测试大致相同,错误率下降很多。

至于7为何比6还低,和本地测试结果相反,暂无结论。

在测试中,数据库、后台服务器 CPU 均未超过 35%,参数100用户数还很保守,除了6、7外其它还未测出其上限。“库存冲突影响性能”的结论不变。

微服务

运行环境

服务配置
PostgreSQL4C8G 40G RSSD 16.4 高可用版
微服务+RedisUbuntu 8C16G
Redis版本7.0 1G 主从 (只给 Seata 用)
GatlingUbuntu 4C8G
Nacos、Seata 2.2.0Ubuntu 8C16G, 采用redis 作为数据备份|

测试结果

测试内容TPS/QPS75%响应时常(ms)错误率备注
1. RPC 基本测试(200用户100次)40004901 redis session check + 1 db query
2. RPC 基本测试(500用户100次)62509101 redis session check + 1 db query
3. RPC 基本测试(1000用户100次)8333.3312601 redis session check + 1 db query
4. RPC 基本测试(1500用户100次)8823.5317601 redis session check + 1 db query
5. 事务基准测试 (200用户,100次)1538.461380只打印日志,无事务
6. 事务基准测试 (1000用户,100次)2777.783980只打印日志,无事务
7. 事务基准测试 (1500用户,100次)2777.785960只打印日志,无事务
8. 库存以内存为准,异步落库(200用户100次)1818.181080用户只购买1~3款产品
9. 库存以内存为准,异步落库(1000用户100次)2083.336110用户只购买1~3款产品
10. 库存以内存为准,异步落库(1500用户100次)1973.689880用户只购买1~3款产品

在以上测试,数据库最高使用率在4%, 最高TPS 3432。 Seata 机器 CPU 最高达到48%。 微服务的服务器达到81%。

该轮测试存在的问题:

  1. 使用的服务器配置还是较低,在实际生产中,一般会提升到20核40G。
  2. 未能用到微服务的LB能力。相比于单实例版本,多增加了RPC和分布式事务开销,TPS降低接近一半。

部署服务

配置文件

后台服务配置文件:

yml
dubbo:
  application:
    logger: slf4j
    name: ${APP_NAME}
    qos-enable: false
    check-serializable: false
  registry:
    address: nacos://${NACOS_ADDRESS}:8848?username=nacos&password=nacos
  protocol:
    port: ${DUBBO_PORT}
    name: tri

seata:
  registry:
    type: nacos
    nacos:
      server-addr: ${SEATA_ADDRESS}:8848
      group: 'SEATA_GROUP'
      namespace: ''
      username: 'nacos'
      password: 'nacos'
      application: seata-server
  tx-service-group: my_tx_group
  service:
    vgroup-mapping:
      my_tx_group: default
    disable-global-transaction: false
  enable-auto-data-source-proxy: false

spring:
  application:
    name: ${APP_NAME}
  datasource:
    url: jdbc:postgresql://${PG_ADDRESS}:5432/db
    username: root
    password: postgres_t
    driver-class-name: org.postgresql.Driver
  data:
    redis:
      host: ${REDIS_ADDRESS}
      jedis:
        pool:
          enabled: true
server:
  port: ${WEB_PORT}

测试环境搭建

shell
# Linux 安装docker,参考官网:
# 1. https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository 安装docker
# 2. https://docs.docker.com/engine/install/linux-postinstall/ user 权限
# 测试环境Linux系统统一为 ubuntu 

sudo apt install zip unzip
curl -s "https://get.sdkman.io" | bash
git clone --depth=1 https://github.com/timzaak/hp.git
sdk install java 17.0.13-tem
sdk install sbt
sdk use java 17.0.13-tem
cd hp/benchmark
sbt compile
## 修改 pg、redis、api server 参数
## vim src/main/resources/application.conf 

## ubuntu install docker
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo mkdir -p /etc/apt/sources.list.d
# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
dokcer ps

微服务部署脚本

shell
# Nacos
docker run -d --name=nacos  --network=host \
-e PREFER_HOST_MODE=hostname \
-e MODE=standalone \
-e NACOS_AUTH_IDENTITY_KEY=serverIdentity \
-e NACOS_AUTH_IDENTITY_VALUE=security \
-e NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789 \
nacos/nacos-server:v2.4.3

# Seata
docker run -d --name seata --network=host \
-e SEATA_IP=10.23.84.252 \
-v $(pwd)/seata.application.yml:/seata-server/resources/application.yml \
apache/seata-server:2.2.0
# -v $(pwd)/seata.logback.xml:/seata-server/resources/logback-spring.xml \

docker run -d --network=host --name=order \
-e APP_NAME=order \
-e PG_ADDRESS=10.23.175.165 \
-e SEATA_ADDRESS=10.23.84.252 \
-e NACOS_ADDRESS=10.23.84.252 \
-e REDIS_ADDRESS=127.0.0.1 \
-e DUBBO_PORT=20883 \
-e WEB_PORT=8080 \
-v $(pwd)/application.yml:/server/config/application.yml \
ghcr.io/timzaak/hp-cloud-order:0.0.5

docker run -d --network=host --name=product \
-e APP_NAME=product \
-e PG_ADDRESS=10.23.175.165 \
-e SEATA_ADDRESS=10.23.84.252 \
-e NACOS_ADDRESS=10.23.84.252 \
-e REDIS_ADDRESS=10.23.129.74 \
-e DUBBO_PORT=20882 \
-e WEB_PORT=8081 \
-v $(pwd)/application.yml:/server/config/application.yml \
ghcr.io/timzaak/hp-cloud-product:0.0.5

docker run -d --network=host --name=others \
-e APP_NAME=others \
-e PG_ADDRESS=10.23.175.165 \
-e SEATA_ADDRESS=10.23.84.252 \
-e NACOS_ADDRESS=10.23.84.252 \
-e REDIS_ADDRESS=10.23.129.74 \
-e DUBBO_PORT=20881 \
-e WEB_PORT=8082 \
-v $(pwd)/application.yml:/server/config/application.yml \
ghcr.io/timzaak/hp-cloud-others:0.0.5