注册
FT平台Linux下sysbench压测DM8实战
专栏/技术分享/ 文章详情 /

FT平台Linux下sysbench压测DM8实战

LyC_Dd 2025/07/18 245 1 0
摘要

在FT平台Linux下使用sysbench对达梦数据库进行压测

一、测试环境

  • 测试环境:两台物理机,一台运行DM实例(DM机),一台使用sysbench压测(压测机)。
  • DM机信息:IP为[数据库服务器IP]。
  • 压测机信息:IP为[压测机IP]。
  • 硬件平台:FT-2000+/64的CPU平台。
  • 操作系统:麒麟v10。
  • 用户信息:用户名是[用户名],密码为[用户密码]。

注意事项:压测机安装sysbench需要有DM的开发包,即压测机同样需要安装DM。

二、环境变量设置

由于本次测试任务中用户无root权限,需设置临时环境变量:

export DM_HOME=/data/test6/dmdbms/ # 这里设置dm的路径 export LD_LIBRARY_PATH=$DM_HOME/dependencies:$DM_HOME:$LD_LIBRARY_PATH

三、后台启动DM(可选前置项)

(一)复制服务文件

在DM机中的DM bin路径下,复制DmService至bin目录:

cp service_template/DmService .

(二)编辑服务文件

进入vim编辑DmService,配置DM_HOME、INT_PATH、DM_BIN_DIR,保存并退出:
image.png

vi DmService :wq

(三)重命名并启动服务

重命名服务名后启动(重命名可选):

mv DmService DmServicelycdd ./DmServicelycdd start

当出现“OK”字样时,表明后台启动实例成功,此时可以关闭该SSH连接而不停止数据库。

(四)重启数据库指令

./DmServicelycdd restart

四、压测机操作

(一)解压

在压缩包路径下使用unzip指令解压sysbench包:

unzip sysbench-master-dpi-20250328.zip

设置文件权限,确保可执行,使用-R递归更改该目录下所有文件的权限:

chmod -R 755 ./sysbench-master-dpi

(二)编译

  1. 进入解压后的包路径执行autogen生成编译工具,此处若报错则说明环境存在问题:
./autogen.sh

image.png
2. 查看当前平台环境:

lscpu

image.png

  1. 对于本次的测试环境,需要在国产arm64平台上编译sysbench,在configure命令时使用参数–build=aarch64-unknown-linux-gnu:
./configure --without-mysql --with-dm --build=aarch64-unknown-linux-gnu

image.png
4. 在源码路径下使用make指令编译:

make

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

cp sysbench ./lua

image.png
6. 进入src/lua目录运行sysbench,出现input行则意味着sysbench成功安装并执行:

./sysbench

image.png

(三)准备数据与脚本

  1. 使用sysbench的写脚本准备测试数据:
./sysbench oltp_read_write.lua --tables=128 --table-size=250000 --db-driver=dm --dm-db=[数据库服务器IP]:6666 --dm-user=SYSDBA --dm-password='[数据库密码]' --auto-inc=0 --threads=64 --time=180 --report-interval=10 prepare

该命令会通过调用oltp_read_write.lua测试脚本,在达梦数据库服务器中创建128张数据表,每张表预先插入25万行测试数据,总计生成3200万条测试记录;连接数据库时使用管理员账号SYSDBA和对应密码进行认证,特别禁用了自增主键功能(–auto-inc=0),并通过64个并发线程执行数据初始化工作,整个准备过程将持续180秒,期间每10秒输出一次数据准备进度报告。
image.png
2. 新建sh脚本,在win中编辑后上传(具体内容在下方详解),需要多一步sed移除\r:

sed -i 's/\r$//' dm_perf_test.sh
  1. 执行测试(线程数=64,表数量=128),后台静默运行:
nohup sh dm_perf_test.sh 64 128 &

既定时间结束后即可查看log文件进行分析。至此,完成了从安装到执行压测脚本的全过程。

五、sh脚本详解

(一)脚本测试内容

测试监控开启和关闭两种状态对数据库性能的影响。

(二)脚本功能

  1. 参数化配置数据库连接信息。
  2. 自动执行3轮性能测试。
  3. 每轮测试包含两种状态(监控开启/关闭)。
  4. 使用sysbench进行OLTP只读测试。
  5. 自动记录测试日志和时间戳。
  6. 提取并记录关键性能指标。

(三)脚本详细内容

1. 配置区域

DB_HOST="[数据库服务器IP]" # 数据库服务器IP地址 DB_PORT="[端口号]" # 数据库监听端口号 SYSBENCH_PATH="./sysbench" # sysbench可执行文件路径 DISQL_PATH="/data/test6/dmdbms/bin/disql" # disql工具路径

使用变量提高脚本可复用性。

2. 参数检查与初始化

if [ $# -ne 2 ]; then echo "错误:需要2个参数(线程数 表数量)" echo "用法: sh dm_perf_test.sh <线程数> <表数量>" exit 1 fi

提供使用说明保证正确执行脚本。

3. 变量设置

THREADS=$1 # 第一个参数:线程数 TABLES=$2 # 第二个参数:表数量 TIMESTAMP=$(date +%Y%m%d_%H%M%S) # 获取当前时间戳 LOG_FILE="dm_perf_${THREADS}t_${TABLES}tab_${TIMESTAMP}.log" # 日志文件名

文件名包含关键参数和时间,便于归档和结果分析,日志文件命名示例如:dm_perf_64t_128tab_20250712_131257.log。

4. 日志记录与输出

echo "===== 达梦数据库性能测试开始 =====" | tee $LOG_FILE echo "测试时间: $(date)" | tee -a $LOG_FILE ...

tee命令同时输出到屏幕和日志文件,tee -a追加内容到日志文件,记录所有关键配置信息用于后续分析。

5. 主测试循环

for ROUND in {1..3}; do ... done

通过for循环执行3轮测试,每轮包含关闭监控和开启监控两种状态。

6. DISQL命令执行(关键部分)

"$DISQL_PATH" SYSDBA/'"[数据库密码]"'@[数据库服务器IP]:[端口号] -E "sp_set_para_value(1,'ENABLE_MONITOR',0);" >> $LOG_FILE 2>&1

硬编码连接信息:SYSDBA/’"[数据库密码]"’@[数据库服务器IP]:[端口号],密码格式为’“密码”'三层引号确保特殊字符正确解析,-E参数用于直接执行SQL语句(无需交互),sp_set_para_value(1,‘ENABLE_MONITOR’,0/1)用于开关性能监控。

7. Sysbench性能测试

$SYSBENCH_PATH oltp_read_only.lua \ --tables=$TABLES \ --table-size=250000 \ --db-driver=dm \ --dm-db=$DB_HOST:$DB_PORT \ --dm-user=SYSDBA \ --dm-password='[数据库密码]' \ --auto-inc=0 \ --threads=$THREADS \ --time=180 \ --report-interval=10 \ run | tee -a $LOG_FILE | awk '/events\/s \(eps\)/ {print "吞吐量(eps): "$NF}' | tee -a $LOG_FILE
  • 测试类型:OLTP只读测试(oltp_read_only.lua)。
  • 数据库配置
    • db-driver=dm:使用达梦数据库驱动。
    • dm-db=[数据库服务器IP]:[端口号]:数据库连接地址。
    • dm-user=SYSDBA:数据库用户。
    • dm-password=’[数据库密码]’:数据库密码。
  • 测试参数
    • tables:表数量。
    • table-size=250000:每表25万行数据。
    • threads:并发线程数。
    • time=180:测试时间180秒(3分钟)。
    • report-interval=10:每10秒输出一次报告。
  • 结果提取:awk命令筛选吞吐量(eps)指标,额外添加"吞吐量(eps):"前缀便于识别。

(四)脚本执行流程

1. 启动

  • 检查参数有效性。
  • 初始化日志文件和变量。

2. 测试轮次

  • 第1轮:关闭监控 → 执行测试 → 开启监控 → 执行测试。
  • 第2轮:关闭监控 → 执行测试 → 开启监控 → 执行测试。
  • 第3轮:关闭监控 → 执行测试 → 开启监控 → 执行测试。

3. 测试结束

  • 输出完成信息。
  • 记录日志文件位置。

(五)预期输出

===== 达梦数据库性能测试开始 ===== 测试时间: 2025年 07月 12日 星期六 13:12:57 CST 参数: 线程数=64, 表数量=128 数据库: [数据库服务器IP]:[端口号] DISQL路径: /data/test6/dmdbms/bin/disql ----- 第1轮测试 ----- 关闭监控 (ENABLE_MONITOR=0) 执行测试 (监控关闭) ... [sysbench输出] ... 吞吐量(eps): 2868.79 开启监控 (ENABLE_MONITOR=1) 执行测试 (监控开启) ... [sysbench输出] ... 吞吐量(eps): 2843.58 ----- 第2轮测试 ----- ... ===== 性能测试完成 ===== 测试日志已保存至: dm_perf_64t_128tab_20250712_131257.log

六、添加vmstat监控系统指标

通过实时监控系统资源(CPU/内存/I/O),可以量化达梦监控功能(ENABLE_MONITOR)的系统开销,定位性能瓶颈。

  1. 后台启动持续监控(每秒采样):
vmstat 1 > vmstat.log &
  1. 插入阶段标记:
echo "[ROUND1] MONITOR OFF" >> vmstat.log
  1. 结束后自动生成对比报告:
awk '计算OFF/ON阶段平均CPU、内存等指标'

七、结果log参考

根据通识以及对log结果分析可知,开启监控后对系统吞吐量有一定影响,数据得出约-5%的性能差。同时,sh脚本中默认vmstat设置了1s的抓取间隔,过于频繁,也会一定程度上影响性能,可参考sysbench的抓取间隔设置为10s。

八、附录:附带vmstat的sh脚本

#!/bin/bash # 文件名: dm_perf_test.sh # 功能: 达梦数据库性能测试工具(集成vmstat监控) # 参数: $1=线程数, $2=表数量 # ===== 配置区域(请根据实际环境修改)===== DB_HOST="[数据库服务器IP]" DB_PORT="[数据库端口号]" SYSBENCH_PATH="./sysbench" DISQL_PATH="[达梦DISQL工具路径]" VMSTAT_INTERVAL=1 # vmstat采样间隔(秒) # ===================================== if [ $# -ne 2 ]; then echo "错误:需要2个参数(线程数 表数量)" echo "用法: sh dm_perf_test.sh <线程数> <表数量>" exit 1 fi THREADS=$1 TABLES=$2 TIMESTAMP=$(date +%Y%m%d_%H%M%S) LOG_FILE="dm_perf_${THREADS}t_${TABLES}tab_${TIMESTAMP}.log" VMSTAT_LOG="vmstat_${THREADS}t_${TABLES}tab_${TIMESTAMP}.log" # 启动后台vmstat监控 echo "启动vmstat监控 (间隔: ${VMSTAT_INTERVAL}s)" | tee -a $LOG_FILE vmstat $VMSTAT_INTERVAL > $VMSTAT_LOG & VMSTAT_PID=$! # 捕获退出信号,确保停止监控 trap "kill $VMSTAT_PID 2>/dev/null; echo '监控已停止'; exit" SIGINT SIGTERM echo "===== 达梦数据库性能测试开始 =====" | tee $LOG_FILE echo "测试时间: $(date)" | tee -a $LOG_FILE echo "参数: 线程数=$THREADS, 表数量=$TABLES" | tee -a $LOG_FILE echo "数据库: ${DB_HOST}:${DB_PORT}" | tee -a $LOG_FILE echo "DISQL路径: ${DISQL_PATH}" | tee -a $LOG_FILE for ROUND in {1..3}; do echo -e "\n----- 第${ROUND}轮测试 -----" | tee -a $LOG_FILE # 记录测试阶段标记 echo "[ROUND ${ROUND}] Phase start: MONITOR OFF" >> $VMSTAT_LOG echo "关闭监控 (ENABLE_MONITOR=0)" | tee -a $LOG_FILE "$DISQL_PATH" [数据库用户名]/'"[数据库密码]"'@[数据库服务器IP]:[数据库端口号] -E "sp_set_para_value(1,'ENABLE_MONITOR',0);" >> $LOG_FILE 2>&1 echo "执行测试 (监控关闭)" | tee -a $LOG_FILE $SYSBENCH_PATH oltp_read_only.lua \ --tables=$TABLES \ --table-size=250000 \ --db-driver=dm \ --dm-db=$DB_HOST:$DB_PORT \ --dm-user=[数据库用户名] \ --dm-password='[数据库密码]' \ --auto-inc=0 \ --threads=$THREADS \ --time=180 \ --report-interval=10 \ run | tee -a $LOG_FILE | awk '/events\/s \(eps\)/ {print "吞吐量(eps): "$NF}' | tee -a $LOG_FILE # 记录测试阶段标记 echo "[ROUND ${ROUND}] Phase start: MONITOR ON" >> $VMSTAT_LOG echo -e "\n开启监控 (ENABLE_MONITOR=1)" | tee -a $LOG_FILE "$DISQL_PATH" [数据库用户名]/'"[数据库密码]"'@[数据库服务器IP]:[数据库端口号] -E "sp_set_para_value(1,'ENABLE_MONITOR',1);" >> $LOG_FILE 2>&1 echo "执行测试 (监控开启)" | tee -a $LOG_FILE $SYSBENCH_PATH oltp_read_only.lua \ --tables=$TABLES \ --table-size=250000 \ --db-driver=dm \ --dm-db=$DB_HOST:$DB_PORT \ --dm-user=[数据库用户名] \ --dm-password='[数据库密码]' \ --auto-inc=0 \ --threads=$THREADS \ --time=180 \ --report-interval=10 \ run | tee -a $LOG_FILE | awk '/events\/s \(eps\)/ {print "吞吐量(eps): "$NF}' | tee -a $LOG_FILE done # 停止vmstat监控 kill $VMSTAT_PID wait $VMSTAT_PID 2>/dev/null echo -e "\n===== 性能测试完成 =====" | tee -a $LOG_FILE echo "测试日志已保存至: $LOG_FILE" | tee -a $LOG_FILE echo "vmstat监控数据已保存至: $VMSTAT_LOG" | tee -a $LOG_FILE # 生成vmstat摘要报告 echo -e "\n===== vmstat关键指标摘要 =====" | tee -a $LOG_FILE echo "采样间隔: ${VMSTAT_INTERVAL}s" | tee -a $LOG_FILE awk ' BEGIN {print "字段说明: r=运行队列, b=阻塞进程, swpd=虚拟内存, free=空闲内存, buff=缓冲, cache=缓存, si=换入, so=换出, us=用户CPU, sy=系统CPU, id=空闲CPU, wa=等待IO"} /Phase start/ {phase = $0; next} !/[a-z]/ && NF>=16 { if (phase ~ /OFF/) { off_count++; off_r+=$1; off_b+=$2; off_us+=$13; off_sy+=$14; off_id+=$15; off_wa+=$16 } if (phase ~ /ON/) { on_count++; on_r+=$1; on_b+=$2; on_us+=$13; on_sy+=$14; on_id+=$15; on_wa+=$16 } } END { printf "监控关闭阶段(平均):\n" printf " r=%.2f, b=%.2f, us=%.2f%%, sy=%.2f%%, id=%.2f%%, wa=%.2f%%\n", off_r/off_count, off_b/off_count, off_us/off_count, off_sy/off_count, off_id/off_count, off_wa/off_count printf "监控开启阶段(平均):\n" printf " r=%.2f, b=%.2f, us=%.2f%%, sy=%.2f%%, id=%.2f%%, wa=%.2f%%\n", on_r/on_count, on_b/on_count, on_us/on_count, on_sy/on_count, on_id/on_count, on_wa/on_count }' $VMSTAT_LOG | tee -a $LOG_FILE
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服