注意事项:压测机安装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 bin路径下,复制DmService至bin目录:
cp service_template/DmService .
进入vim编辑DmService,配置DM_HOME、INT_PATH、DM_BIN_DIR,保存并退出:
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
./autogen.sh
2. 查看当前平台环境:
lscpu
./configure --without-mysql --with-dm --build=aarch64-unknown-linux-gnu
4. 在源码路径下使用make指令编译:
make
5. 编译成功后,在src目录下生成可执行文件sysbench,将sysbench拷贝到src/lua目录下:
cp sysbench ./lua
6. 进入src/lua目录运行sysbench,出现input行则意味着sysbench成功安装并执行:
./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秒输出一次数据准备进度报告。
2. 新建sh脚本,在win中编辑后上传(具体内容在下方详解),需要多一步sed移除\r:
sed -i 's/\r$//' dm_perf_test.sh
nohup sh dm_perf_test.sh 64 128 &
既定时间结束后即可查看log文件进行分析。至此,完成了从安装到执行压测脚本的全过程。
测试监控开启和关闭两种状态对数据库性能的影响。
DB_HOST="[数据库服务器IP]" # 数据库服务器IP地址
DB_PORT="[端口号]" # 数据库监听端口号
SYSBENCH_PATH="./sysbench" # sysbench可执行文件路径
DISQL_PATH="/data/test6/dmdbms/bin/disql" # disql工具路径
使用变量提高脚本可复用性。
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" # 日志文件名
文件名包含关键参数和时间,便于归档和结果分析,日志文件命名示例如:dm_perf_64t_128tab_20250712_131257.log。
echo "===== 达梦数据库性能测试开始 =====" | tee $LOG_FILE
echo "测试时间: $(date)" | tee -a $LOG_FILE
...
tee命令同时输出到屏幕和日志文件,tee -a追加内容到日志文件,记录所有关键配置信息用于后续分析。
for ROUND in {1..3}; do
...
done
通过for循环执行3轮测试,每轮包含关闭监控和开启监控两种状态。
"$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)用于开关性能监控。
$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
===== 达梦数据库性能测试开始 ===== 测试时间: 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
通过实时监控系统资源(CPU/内存/I/O),可以量化达梦监控功能(ENABLE_MONITOR)的系统开销,定位性能瓶颈。
vmstat 1 > vmstat.log &
echo "[ROUND1] MONITOR OFF" >> vmstat.log
awk '计算OFF/ON阶段平均CPU、内存等指标'
根据通识以及对log结果分析可知,开启监控后对系统吞吐量有一定影响,数据得出约-5%的性能差。同时,sh脚本中默认vmstat设置了1s的抓取间隔,过于频繁,也会一定程度上影响性能,可参考sysbench的抓取间隔设置为10s。
#!/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
文章
阅读量
获赞