注册
使用sysbench进行压测达梦数据库
专栏/技术分享/ 文章详情 /

使用sysbench进行压测达梦数据库

DM_159753 2025/07/25 261 0 0
摘要

一、sysbench简介

1.Sysbench 是什么?

sysbench 是一个开源的、多线程的基准测试工具,主要用于测试 数据库系统性能操作系统的各种基础性能指标。它支持灵活的参数配置,并通过 Lua 脚本扩展实现多种测试类型,是业界常用的性能评估工具之一。


主要特性

  • 支持多线程:模拟高并发环境
  • 模块化设计:可测试 CPU、内存、I/O、线程、数据库等子系统
  • Lua 脚本支持:灵活自定义测试逻辑(如 OLTP 读写测试)
  • 支持多种数据库驱动MySQLPostgreSQL、Oracle、达梦(dm)等
  • 详细的统计输出:如 TPS(事务数)、QPS(查询数)、延迟分布等

二、测试过程

1. 环境准备

数据库版本: 达梦数据库 V8

测试工具: sysbench

操作系统: Kylin10 SP1

2. sysbench软件准备

下载:到github下载sysbench压缩包

https://github.com/wuwen5/sysbench

下载好文件:
sysbench-master.zip

解压

unzip sysbench-master.zip

3. sysbench部署

3.1 执行脚本

# 进入/sysbench-master/目录执行以下指令 ./autogen.sh
  • 运行结果
    image.png

3.2 执行配置脚本

# 赋予可执行权限 chmod +x configure #**执行当前目录下的 configure 配置脚本,并传入参数 ./configure --without-mysql --with-dm \ CFLAGS="-I/dmdbms/include" \ LDFLAGS="-L/dmdbms/lib64"

image.png

3.3 编译

  • 执行make指令
make
  • 运行结果

image.png

  • 编译成功后,在src目录下生成可执行文件sysbench,将sysbench拷贝到src/lua目录下
cp sysbench ./lua

4. 压测执行流程

我采用 sysbench 的典型三段式压测流程:

4.1 执行sysbench

  • 进入/src/lua/目录,,执行sysbench脚本
./sysbench
  • 运行结果
    image.png

4.2 数据准备阶段

  • (注意要启动数据库):
./sysbench oltp_read_write.lua --tables=25 --table-size=250000 --db-driver=dm --dm-db=IP:端口 --dm-user=用户名 --dm-password=密码 --auto-inc=0 --threads=64 --time=180 --report-interval=10 prepare
  • 各参数详细解释:
参数 说明
./sysbench 当前目录下的 sysbench 可执行程序
oltp_read_write.lua 使用官方/自定义的 Lua 脚本进行 读写混合型压测OLTP
--tables=25 创建 25张测试表(模拟高并发分库表场景)
--table-size=250000 每张表插入 25 万行记录(共 3200 万行)
--db-driver=dm 指定数据库驱动为达梦(Dameng
--dm-db=IP:端口 达梦数据库地址与端口(你实际使用的是5432)
--dm-user=用户名 数据库用户名
--dm-password='密码' 数据库密码(建议不要明文写在脚本中)
--auto-inc=0 不使用自增主键(可控制性能差异)
--threads=64 使用 64 个线程并发执行数据插入任务
--time=180 每轮测试持续时间为 180 秒(prepare 阶段实际不使用)
--report-interval=10 每隔 10 秒输出一次进度(对 prepare 阶段意义不大)
prepare 准备阶段:创建表和插入初始数据
  • 运行结果:

image.png

4.3 压测运行阶段(读写混合)

./sysbench oltp_read_write.lua --tables=25 --table-size=250000 --db-driver=dm --dm-db=IP:端口 --dm-user=用户名 --dm-password=密码 --auto-inc=0 --threads=64 --time=180 --report-interval=10 run
  • 运行结果
    image.png
    image.png

4.4 清理数据

./sysbench oltp_read_write.lua --tables=25 --table-size=250000 --db-driver=dm --dm-db=IP:端口 --dm-user=用户名 --dm-password=密码 --auto-inc=0 --threads=64 --time=180 --report-interval=10 cleanup

5. 调整参数,执行脚本

5.1 准备脚本run_sysbench_tests.sh

#!/bin/bash # sysbench可执行文件路径 SYSBENCH=./sysbench # 公共参数 DB_IP="IP" DB_PORT="端口" DB_USER="用户名" DB_PASS="密码" TABLE_SIZE=250000 DB_DRIVER="dm" AUTO_INC=0 TIME=180 REPORT_INTERVAL=10 LUA_SCRIPT="oltp_read_write.lua" THREADS_LIST=(16 32 64 ) TABLES_LIST=(4 8 16 32 ) # 创建日志目录 LOG_DIR="./sysbench_logs" mkdir -p "$LOG_DIR" # 执行测试函数 run_test() { local threads=$1 local tables=$2 local prefix="t${threads}_tbl${tables}" echo "=================================================" echo "Threads=$threads, Tables=$tables" echo "=================================================" # 准备阶段 echo " prepare 开始..." $SYSBENCH $LUA_SCRIPT \ --threads=$threads \ --tables=$tables \ --table-size=$TABLE_SIZE \ --db-driver=$DB_DRIVER \ --dm-db=${DB_IP}:${DB_PORT} \ --dm-user=$DB_USER \ --dm-password=$DB_PASS \ --auto-inc=$AUTO_INC \ --time=$TIME \ --report-interval=$REPORT_INTERVAL \ prepare > "$LOG_DIR/${prefix}_prepare.log" # 运行阶段 echo " run 开始..." $SYSBENCH $LUA_SCRIPT \ --threads=$threads \ --tables=$tables \ --table-size=$TABLE_SIZE \ --db-driver=$DB_DRIVER \ --dm-db=${DB_IP}:${DB_PORT} \ --dm-user=$DB_USER \ --dm-password=$DB_PASS \ --auto-inc=$AUTO_INC \ --time=$TIME \ --report-interval=$REPORT_INTERVAL \ run > "$LOG_DIR/${prefix}_run.log" # 清理阶段 echo " cleanup 开始..." $SYSBENCH $LUA_SCRIPT \ --threads=$threads \ --tables=$tables \ --table-size=$TABLE_SIZE \ --db-driver=$DB_DRIVER \ --dm-db=${DB_IP}:${DB_PORT} \ --dm-user=$DB_USER \ --dm-password=$DB_PASS \ --auto-inc=$AUTO_INC \ --time=$TIME \ --report-interval=$REPORT_INTERVAL \ cleanup > "$LOG_DIR/${prefix}_cleanup.log" echo " Threads=$threads, Tables=$tables 完成" echo "" } # 主流程:循环线程 × 表数 for threads in "${THREADS_LIST[@]}"; do for tables in "${TABLES_LIST[@]}"; do run_test $threads $tables done done

5.2 执行脚本

  • 执行以下命令将其转换为 Linux 换行格式:使用 dos2unix
dos2unix run_sysbench_tests.sh
  • 确认文件具有可执行权限:
chmod +x run_sysbench_tests.sh
  • 运行脚本:
./run_sysbench_tests.sh

6. 结果

  • 表头为“表格数”(每个测试使用了多少个表)
  • 行头为“线程数”(并发线程数量)
  • 单元格数据是 TPS(每秒事务数)或其他性能指标(单位应为 TPS

原始表格结构

线程数 \ 表格数 4 8 16 32
16 872.87 773.43 820.34 465.49
32 1160.38 1076.23 781.58 646.63
64 1165.72 1175.99 748.84 758.02

三、测试结论

1. 整体趋势:并发线程数增加,性能先升后略降

  • 当线程从 16 增加到 32、64,TPS 提升明显,说明系统初期具有良好的并发扩展能力。
  • 但从 32 到 64 时,部分场景如(16 表)反而 TPS 降低,说明:
    • 存在一定的资源竞争(例如锁、IO)
    • 系统达到瓶颈

结论:并发数不是越高越好,系统有最优并发点。


2. 随着“表格数”增加,性能大多下降

以线程数为 16 为例:

表格数 TPS
4 872.87
8 773.43
16 820.34
32 465.49
  • 表数从 4 → 8 → 16,TPS有波动,但总体还能接受;
  • 到 32 表,TPS 降幅明显(尤其线程少时),可能因为:
    • 表数量过多导致索引、缓存不命中,增加 IO
    • 查询计划复杂化或连接时间增长

结论:表数越多,并发管理越复杂,性能下降明显,需合理控制表数量。


3. 最佳性能点

  • 最高 TPS:1175.99 → 线程 64,表数 8
    • 此时 CPU/内存/IO 配置和并发基本匹配
  • 性能平衡点建议:
    • 线程数:32~64
    • 表数:4~8
    • 超过 16 表或线程过多容易带来反效果

4. 总结建议

项目 分析结论
并发线程数增加 TPS 先升后降,推荐并发 32~64
表格数量增加 TPS 降低明显,推荐表数 4~8
最佳组合 线程 64,表格数 8(1175.99 TPS
建议 优化数据库连接池与表结构,控制并发与表数量的组合,提高缓存命中率

四、测试过程遇到的问题

1. 脚本无法执行:/bin/bash^M: 解释器错误

  • 问题描述:
    执行脚本时出现如下错误:

    -bash: ./run_sysbench_tests.sh: /bin/bash^M: 解释器错误: 没有那个文件或目录
  • 原因分析:
    脚本文件是在 Windows 编写,包含 ^M\r 回车符),Linux 无法识别。

  • 解决方案:

    dos2unix run_sysbench_tests.sh # 或使用 sed 替代 sed -i 's/\r$//' run_sysbench_tests.sh

2. 日志分析困难:输出杂乱

  • 问题描述:
    每轮测试输出大量日志,不易比对不同线程/表数的性能表现。
  • 建议解决方案:
    • 每次测试单独输出日志文件到指定目录,如:
      sysbench_logs/t32_tbl16_r2_run.log

3. 数据准备阶段慢或卡死

  • 问题描述:
    执行 prepare 阶段时,插入数据较多时非常慢,甚至数据库响应缓慢。

  • 可能原因:

    • 表数量太多(如 128 表 × 25 万行),导致事务量极大
    • 数据库未做参数优化(如 page_size, cache_size
  • 解决建议:

    • 控制 prepare 阶段表数或表大小

    • 调整达梦系统参数,如:

alter system set ENABLE_MONITOR=0; alter system set BUFFER=512;
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服