1 简介

benchmarksql是一款针对Mysql、Postgresql、Oracle数据库的实现TPC-C规范的开源性能压测工具,它原生不支持SQL Server。在github.com上找到一个功能优化过的benchmarksql项目,支持SQL Server,地址如下:

https://github.com/iihero/benchmarksql-v5

基于此项目,我构建出一个容器镜像,方便一键压测。

在本文中,通过一台Centos 7.9的ECS和一个SQL Server服务来演示压测。这台ECS需要安装docker,安装命令如下:

yum install -y yum-utils device-mapper-persistent-data lvm2
yum install yum-utils -y
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates
yum install docker-ce-cli-20.10.5-3.el7 docker-ce-20.10.5-3.el7 -y

mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{
      "max-concurrent-downloads": 10,
      "log-driver": "json-file",
      "log-level": "warn",
      "log-opts": {
          "max-size": "100m",
          "max-file": "3"
      },
      "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

systemctl daemon-reload
systemctl enable docker
systemctl restart docker

2 压测

2.1 准备database

在SQL Server中创建database,这里database名称为benchmarksql。
在这里插入图片描述

2.2 准备benchmarksql配置文件

配置文件一般只需要修改连接信息和并发信息。
连接信息包括:SQL Server服务器的IP、账号密码。
并发信息包括:warehouses、loadWorkers、terminals、runMins字段。

配置文件模板如下:

# 数据库类型
db=transact-sql
# JDBC 驱动类名
driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
# 连接 URL(关键:替换 databaseName 为你预先创建的空数据库名)
conn=jdbc:sqlserver://<your-sql-server-ip>:1433;databaseName=benchmarksql;encrypt=true;trustServerCertificate=true;
# 数据库用户名和密码
user=<your-user>
password=<your-password>

# 数据规模(仓库数,每个仓库约100MB)
warehouses=10
# 数据加载时的并发线程数
loadWorkers=4

# 测试并发终端数(模拟用户数)
terminals=4
# 测试运行时长(分钟)
runMins=5
# 每个终端的事务数,设为0则使用 runMins
runTxnsPerTerminal=0
# 每分钟事务数限制,0表示无限制
limitTxnsPerMin=0

# TPC-C 标准建议为 true
terminalWarehouseFixed=true

# 五种事务的权重总和必须为100
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4

# 压测数据写入文件
resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS

2.3 准备数据

通过benchmarksql的脚本在目标SQL Server中初始化数据。

docker run -it --rm -v /opt/props.mssql:/opt/props.mssql swr.cn-south-1.myhuaweicloud.com/migrator/benchmarksql:mssql bash runDatabaseBuild.sh /opt/props.mssql

在这里插入图片描述

2.4 压测

通过benchmarksql的脚本对目标SQL Server进行压测,命令行终端最终会出现一个压测总结报告。

docker run -it --rm -v /opt/props.mssql:/opt/props.mssql swr.cn-south-1.myhuaweicloud.com/migrator/benchmarksql:mssql bash runBenchmark.sh /opt/props.mssql

在这里插入图片描述
在这里插入图片描述

2.5 清理数据

通过benchmarksql的脚本在目标SQL Server中删除压测数据。

docker run -it --rm -v /opt/props.mssql:/opt/props.mssql swr.cn-south-1.myhuaweicloud.com/migrator/benchmarksql:mssql bash runDatabaseDestroy.sh /opt/props.mssql

3 如何自行构建容器镜像

3.1 步骤1:修改pom.xml

第三方github.com项目(https://github.com/iihero/benchmarksql-v5)原生支持SAP数据库,但maven编译时是无法在中央仓库获取相关依赖,因此需要删除SAP相关的maven依赖,如下图:
在这里插入图片描述
为加快构建速度,在pom.xml中引入阿里云maven源

      <repositories>
              <repository>
                     <id>public</id>
                     <name>public</name>
                     <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
              </repository>
       </repositories>
        <pluginRepositories>
              <pluginRepository>
                     <id>public-plugin</id>
                     <name>public-plugin</name>
                     <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
              </pluginRepository>
       </pluginRepositories>

3.2 步骤2:创建Dockerfile

# 使用一个包含 Maven 和 OpenJDK 的基础镜像
FROM maven:3.8-openjdk-8-slim

# 设置工作目录
WORKDIR /benchmarksql

# 将项目源码复制到容器中
COPY . /benchmarksql

# 使用 Maven 编译项目,并跳过测试以加快速度
RUN mvn clean package -DskipTests

# 设置工作目录到 run 文件夹,方便执行脚本
WORKDIR /benchmarksql/target/run

# 容器启动时默认进入 bash,方便手动操作
CMD ["/bin/bash"]

3.3 步骤3:docker build构建

docker build -t "benchmarksql:mssql" .

更多推荐