TPCC测试DM
本文介绍如何对达梦数据库进行TPCC基准测试,以及参数方面的调优路径。
测试环境
修改源码
在官网下载并完成安装BenchmarkSQL,由于该工具默认不支持达梦数据库,需要修改部分源码,编辑benchmarksql-5.0/src/client/jTPCC.java文件,找到以下部分代码并增加达梦相关配置(红色字体部分),使其支持达梦数据库。
if (iDB.equals(“firebird”))
dbType = DB_FIREBIRD;
else if (iDB.equals(“oracle”))
dbType = DB_ORACLE;
else if (iDB.equals(“postgres”))
dbType = DB_POSTGRES;
else if (iDB.equals(“dameng”))
dbType = DB_UNKNOWN;
else
{
log.error(“unknown database type '” + iDB + “'”);
return;
}
修改完源码保存后,进入benchmarksql目录下,直接执行ant命令重新进行编译。执行过程如下:
[root@dmdb01 ~]# cd /opt/benchmarksql-5.0
[root@dmdb01 benchmarksql-5.0]# ant
Buildfile: /opt/benchmarksql-5.0/build.xml
init:
compile:
[javac] Compiling 11 source files to /opt/benchmarksql-5.0/build
dist:
[jar] Building jar: /opt/benchmarksql-5.0/dist/BenchmarkSQL-5.0.jar
BUILD SUCCESSFUL
Total time: 2 seconds
创建数据库用户
在达梦数据库中创建BENCHMARK用户,密码123456789
CREATE USER benchmark IDENTIFIED BY 123456789;
授权benchmark用户DBA管理员权限
GRANT DBA TO benchmark;
创建配置文件
在benchmarksql-5.0/run目录下创建达梦的props.dm配置文件,添加以下内容:
vi benchmarksql-5.0/run/props.dm
db=dameng
//数据库类型
driver=dm.jdbc.driver.DmDriver
//驱动程序,每种数据库有对应的驱动
conn=jdbc:dm://192.168.10.121:5236
//连接字符串, IP、端口
user=BENCHMARK
//数据库登录用户
password=123456789
//数据库登录用户的密码
warehouses=10
//该参数用于指定仓库个数,每个warehouse大小大概是100MB,用于控制测试数据量。如果该参数设置为10,整个数据库(9张表)的大小大概在1GB,每个仓库负责十个区域的供货,每个区域3000个客户服务,每个仓库维护100000种商品的库存纪录,每个仓库至多有10个终端
loadWorkers=8
//该参数用于指定测试数据加载时的并行度,即数据库中初始化数据的加载进程数量
terminals=1
//To run specified transactions per terminal- runMins must equal zero
//参数用于指定模拟终端数,即并发客户端数量
runTxnsPerTerminal=0
//To run for specified minutes- runTxnsPerTerminal must equal zero
//该参数用于指定每个终端提交事务数,每个终端运行的固定事务数量。如果该值设置为10,意味着每个终端运行10个事务,如果有32个终端,那整体运行320个事务后。该参数和unMins只能选择设置一个,如果该配置为非0值时,下面的runMins参数必须设置为0
runMins=3
//Number of total transactions per minute
//该参数用于指定运行时间,单位是分钟。该值设置为非0值时,runTxnsPerTerminal参数必须设置为0。如果这两个参数设置其中一个,另一个必须为0,主要区别是runMins定义时间长度来控制测试时间;runTxnsPerTerminal定义事务总数来控制时间。
limitTxnsPerMin=0
//Set to true to run in 4.x compatible mode. Set to false to use the
//entire configured database evenly.
//参数用于指定每分钟提交事务数限制
terminalWarehouseFixed=true
//该参数用于指定终端和仓库的绑定模式,设置为true时可以运行4.x兼容模式,意思为每个终端都有一个固定的仓库。设置为false时可以均匀的使用数据库整体配置。TPCC规定每个终端都必须有一个绑定的仓库,所以一般使用默认值true
//The following five values must add up to 100
//The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec
//五个值的总和必须等于100,默认值为45、43、4、4和4,要与TPC-C测试定义的比例一致,实际操作过程中,可以调整比重来适应各种场景。
newOrderWeight=45
//客户输入一笔新的订货交易,在各个类型的交易在系统中所占的比例45%
paymentWeight=43
//更新客户账户余额以反应其支付状况,在各个类型的交易在系统中所占的比例43%
orderStatusWeight=4
//发货(批处理交易),在各个类型的交易在系统中所占的比例4%
deliveryWeight=4
//查询客户最近交易的状态,在各个类型的交易在系统中所占的比例4%
stockLevelWeight=4
//查询仓库库存状况,在各个类型的交易在系统中所占的比例4%
// Directory name to create for collecting detailed result data.
// Comment this out to suppress.
resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
//测试数据生成目录,默认无需修改,默认生成在run目录下面,名字形如my_result_xxxx的文件夹
osCollectorScript=./misc/os_collector_linux.py
//操作系统性能收集脚本,默认无需修改,需要操作系统具备有python环境
osCollectorInterval=1
//操作系统收集操作间隔,默认为1秒
//osCollectorSSHAddr=user@dbhost
//操作系统收集所对应的主机,如果对本机数据库进行测试,该参数保持注销即可,如果要对远程服务器进行测试,请填写用户名和主机名。
//osCollectorDevices=net_eth0 blk_sda
//操作系统中被收集服务器的网卡名称和磁盘名称
其中,基准测试要求交易类型的比例必须为:
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4
修改脚本
编辑benchmarksql-5.0/run下的funcs.sh脚本文件,找到以下部分代码并添加dm数据库类型(红色字体部分)。
function setCP()
{
case “
(
g
e
t
P
r
o
p
d
b
)
"
i
n
f
i
r
e
b
i
r
d
)
c
p
=
"
.
.
/
l
i
b
/
f
i
r
e
b
i
r
d
/
∗
:
.
.
/
l
i
b
/
∗
"
;
;
d
a
m
e
n
g
)
c
p
=
"
.
.
/
l
i
b
/
d
a
m
e
n
g
/
∗
:
.
.
/
l
i
b
/
∗
"
;
;
o
r
a
c
l
e
)
c
p
=
"
.
.
/
l
i
b
/
o
r
a
c
l
e
/
∗
"
i
f
[
!
−
z
"
(getProp db)" in firebird) cp="../lib/firebird/*:../lib/*" ;; dameng) cp="../lib/dameng/*:../lib/*" ;; oracle) cp="../lib/oracle/*" if [ ! -z "
(getPropdb)"infirebird)cp="../lib/firebird/∗:../lib/∗";;dameng)cp="../lib/dameng/∗:../lib/∗";;oracle)cp="../lib/oracle/∗"if[!−z"{ORACLE_HOME}” -a -d
O
R
A
C
L
E
H
O
M
E
/
l
i
b
]
;
t
h
e
n
c
p
=
"
{ORACLE_HOME}/lib ] ; then cp="
ORACLEHOME/lib];thencp="{cp}:
O
R
A
C
L
E
H
O
M
E
/
l
i
b
/
∗
"
f
i
c
p
=
"
{ORACLE_HOME}/lib/*" fi cp="
ORACLEHOME/lib/∗"ficp="{cp}:…/lib/"
;;
postgres)
cp="…/lib/postgres/:…/lib/"
;;
esac
myCP=".😒{cp}:…/dist/"
export myCP
}
#----
Make sure that the properties file does have db= and the value
#is a database, we support.
#----
case “$(getProp db)” in
firebird|oracle|postgres|dameng)
;;
“”) echo “ERROR: missing db= config option in KaTeX parse error: Expected 'EOF', got '&' at position 11: {PROPS}" >&̲2 exit …(getProp db)’ in ${PROPS}” >&2
exit 1
;;
esac
添加驱动包
在benchmarksql-5.0/lib目录下创建一个dameng目录,将达梦数据库对应的jdbc驱动拷贝至该目录下,例如达梦数据库安装在/home/dmdba/dmdbms下,而BenchmarkSQL工具安装在目录/opt下,则如下拷贝:
cp -r /home/dmdba/dmdbms/drivers/jdbc/DmJdbcDriver* /opt/benchmarksql-5.0/lib/dameng/
基准测试流程
准备测试环境所需的表,先创建表,再装载数据,最后创建索引
在benchmarksql-5.0/run/目录下执行以下命令:
- 执行建表工具
./runSQL.sh props.dm tableCreates
若遇到下面问题,可通过更换jdk版本至11及以上解决
-
执行数据装载工具
./runLoader.sh props.dm
-
创建索引
./runSQL.sh props.dm indexCreates
-
执行测试工具
./runBenchmark.sh props.dm
-
清理数据
测试完之后应该清理数据。执行:
./runSQL.sh props.dm indexDrops ##删除索引
./runSQL.sh props.dm tableTruncates ##清空表
./runSQL.sh props.dm tableDrops ##删除表 -
测试结果
测试完之后结果会保存在benchmarksql-5.0/run目录下的“my_result_日期_时间”文件夹中。
至此,已完成达梦数据库的BenchmarkSQL基准测试。
测试调整Buffer参数
Buffer参数设置不合理
修改buffer参数,调整为500
执行tpcc测试,测试结果如下图
测试过程中查看v$bufferpool视图
从中可以看到,free 项为0,N_DISCARD64项有非零出现,表明缓冲区经常淘汰,这是由于缓冲区参数设置太小导致的频繁淘汰现象,需要调整对应缓冲区的参数。
Buffer参数设置合理
buffer是系统缓冲区大小,如果数据量小于内存,则设置为数据量大小;否则设置为总内存的 2/3 比较合适。
我们先修改Buffer参数值为1000M,查看调整后的测试表现,可通过不断调试找到最合适的优化值。
重启数据库,使参数生效
测试结果
测试过程中查看v$bufferpool视图
缓冲区的free 较大,说明缓冲区都较为空闲,没有发生缓冲区淘汰。
测试结果
通过将buffer值从500M调整为1000M,我们可以看到系统缓冲区都较为空闲,没有发生缓冲区淘汰的现象,这表明1000M是比较合适的参数值,相比buffer设置为500M,测试的性能表现也有所提升。
更多详细资料可前往达梦社区:https://eco.dameng.com