sysbench
简介Sysbench
是什么?sysbench
是一个开源的、多线程的基准测试工具,主要用于测试 数据库系统性能 和 操作系统的各种基础性能指标。它支持灵活的参数配置,并通过 Lua
脚本扩展实现多种测试类型,是业界常用的性能评估工具之一。
Lua
脚本支持:灵活自定义测试逻辑(如 OLTP 读写测试)MySQL
、PostgreSQL
、Oracle、达梦(dm
)等TPS
(事务数)、QPS
(查询数)、延迟分布等数据库版本: 达梦数据库 V8
测试工具: sysbench
操作系统: Kylin10 SP1
sysbench
软件准备下载:到github
下载sysbench
压缩包
https://github.com/wuwen5/sysbench
下载好文件:
sysbench-master.zip
解压
unzip sysbench-master.zip
sysbench
部署# 进入/sysbench-master/目录执行以下指令
./autogen.sh
# 赋予可执行权限
chmod +x configure
#**执行当前目录下的 configure 配置脚本,并传入参数
./configure --without-mysql --with-dm \
CFLAGS="-I/dmdbms/include" \
LDFLAGS="-L/dmdbms/lib64"
make
sysbench
,将sysbench
拷贝到src/lua
目录下cp sysbench ./lua
我采用 sysbench
的典型三段式压测流程:
sysbench
/src/lua/
目录,,执行sysbench
脚本./sysbench
./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 |
准备阶段:创建表和插入初始数据 |
./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
./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
#!/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
dos2unix
dos2unix run_sysbench_tests.sh
chmod +x run_sysbench_tests.sh
./run_sysbench_tests.sh
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 |
TPS
提升明显,说明系统初期具有良好的并发扩展能力。TPS
降低,说明:
结论:并发数不是越高越好,系统有最优并发点。
以线程数为 16 为例:
表格数 | TPS |
---|---|
4 | 872.87 |
8 | 773.43 |
16 | 820.34 |
32 | 465.49 |
TPS
有波动,但总体还能接受;TPS
降幅明显(尤其线程少时),可能因为:
结论:表数越多,并发管理越复杂,性能下降明显,需合理控制表数量。
TPS
:1175.99 → 线程 64,表数 8
项目 | 分析结论 |
---|---|
并发线程数增加 | TPS 先升后降,推荐并发 32~64 |
表格数量增加 | TPS 降低明显,推荐表数 4~8 |
最佳组合 | 线程 64,表格数 8(1175.99 TPS ) |
建议 | 优化数据库连接池与表结构,控制并发与表数量的组合,提高缓存命中率 |
/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
sysbench_logs/t32_tbl16_r2_run.log
问题描述:
执行 prepare
阶段时,插入数据较多时非常慢,甚至数据库响应缓慢。
可能原因:
page_size
, cache_size
)解决建议:
控制 prepare 阶段表数或表大小
调整达梦系统参数,如:
alter system set ENABLE_MONITOR=0;
alter system set BUFFER=512;
文章
阅读量
获赞