数据库基准测试2:HammerDB自带脚本(DB2)

0.前面要说的话

上一章节简单介绍了一下hammerdbcli的使用方法,但通过命令行的方式不适合大批量数据基准测试(灌了3000仓库的tpcc数据在虚拟 机上耗时超过了1天多),实际hammerdb已经内置了多种数据库类型的基准测试脚本,以下以db2为例简单说明如何使用这些脚本。

1.基准测试脚本

HammerDB自带的DB2 TPC-C测试脚本的路径是/opt/HammerDB-5.0/scripts/tcl/db2/tprocc,主要内容有以下,为方便修改,复制一个/tprocc目录为/tprocc_1,方便后续修改。

[root@phgdrh1886pa tprocc]# pwd
/opt/HammerDB-5.0/scripts/tcl/db2/tprocc
[root@phgdrh1886pa tprocc]# ll
total 28
-rw-r--r-- 1 root root  693 May 26 16:07 db2_tprocc_buildschema.tcl
-rw-r--r-- 1 root root  362 Mar 30 22:04 db2_tprocc_checkschema.tcl
-rw-r--r-- 1 root root  362 Mar 30 22:04 db2_tprocc_deleteschema.tcl
-rw-r--r-- 1 root root 1010 Mar 30 22:04 db2_tprocc.ps1
-rw-r--r-- 1 root root  116 Mar 30 22:04 db2_tprocc_result.tcl
-rw-r--r-- 1 root root  538 Mar 30 22:04 db2_tprocc_run.tcl
-rw-r--r-- 1 root root  950 Jul 14 16:19 db2_tprocc.sh

首先看db2_tprocc.sh,这个脚本实际是将buildschema、checkschema、run、deleteschema、result几个过程放在一起执行,对于大测试而言,此脚本最好拆成多个执行。

2.测试脚本的修改

2.1.buildschema的修改

修改db2_tprocc_buildschema.tcl

参考以下中文注释进行修改,下同

#!/bin/tclsh
# maintainer: Pooja Jain

puts "SETTING CONFIGURATION"
dbset db db2
dbset bm TPC-C

diset connection db2_def_user hammerdb  ## 修改为对应的数据库用户名
diset connection db2_def_pass my_passwd  ## 修改为对应的数据库密码
diset connection db2_def_dbase testdb  ## 修改为对应的数据库名称

#set vu [ numberOfCPUs ]
#set warehouse [ expr {$vu * 5} ]

set vu 16              ## 设置加载测试数据的并发用户数,建议=cpu的核心数
set warehouse 3000     ## 设置测试数据的仓库数,可以自己定一个标准,较大的负载为3000个仓库,1000个仓库约100GB数据

diset tpcc db2_count_ware $warehouse
diset tpcc db2_num_vu $vu
diset tpcc db2_user hammerdb    ## 修改为对应的用户名称
diset tpcc db2_pass my_passwd    ## 修改为对应的数据库密码
diset tpcc db2_dbase testdb      ## 修改为对应的数据库名称
diset tpcc db2_def_tab USERSPACE1
diset tpcc db2_tab_list {C "" D "" H "" I "" W "" S "" NO "" OR "" OL ""}

if { $warehouse >= 10 } {
diset tpcc db2_partition true
        } else {
diset tpcc db2_partition false
        }
puts "SCHEMA BUILD STARTED"
buildschema
puts "SCHEMA BUILD COMPLETED"

2.2.checkschema的修改

修改db2_tprocc_checkschema.tcl

#!/bin/tclsh
# maintainer: Pooja Jain

puts "SETTING CONFIGURATION"
dbset db db2
dbset bm TPC-C

diset connection db2_def_user hammerdb      ## 修改为对应的用户名称
diset connection db2_def_pass Ghac.cn@123   ## 修改为对应的数据库密码
diset connection db2_def_dbase testdb       ## 修改为对应的数据库名称

diset tpcc db2_user hammerdb                ## 修改为对应的用户名称
diset tpcc db2_pass Ghac.cn@123             ## 修改为对应的数据库密码
diset tpcc db2_dbase testdb                 ## 修改为对应的数据库名称

puts "CHECK SCHEMA STARTED"
checkschema
puts "CHECK SCHEMA COMPLETED"

2.3.run的修改

修改db2_tprocc_run.tcl

#!/bin/tclsh
# maintainer: Pooja Jain

set tmpdir $::env(TMP)
puts "SETTING CONFIGURATION"
dbset db db2
dbset bm TPC-C

diset tpcc db2_user hammerdb        ## 修改为对应的用户名称
diset tpcc db2_pass Ghac.cn@123     ## 修改为对应的数据库密码
diset tpcc db2_dbase testdb         ## 修改为对应的数据库名称
diset tpcc db2_driver timed
diset tpcc db2_rampup 2
diset tpcc db2_duration 5
diset tpcc db2_allwarehouse true
diset tpcc db2_timeprofile true

loadscript
puts "TEST STARTED"
# vuset vu vcpu
vuset vu 16
vucreate
tcstart
tcstatus
set jobid [ vurun ]
vudestroy
tcstop
puts "TEST COMPLETE"
set of [ open $tmpdir/db2_tprocc w ]
puts $of $jobid
close $of

2.4.delete及result的修改

  • db2_tprocc_deleteschema.tcl脚本不建议执行,因为有多次执行的需要;
  • db2_tprocc_result.tcl脚本不需要修改

2.5.db2_tprocc.sh的修改

db2_tprocc.sh脚本的内容整体如下:

export TMP=`pwd`/TMP
mkdir -p $TMP

home_dir=/opt/HammerDB-5.0    # 增加home_dir参数,方便在'tprocc_1'当前目录下执行脚本
cur_dir=tprocc_1              # 将默认的'tprocc'目录修改为'tprocc_1'目录,以下对应做修改

echo "BUILD HAMMERDB SCHEMA"
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
${home_dir}/hammerdbcli auto ./scripts/tcl/db2/${cur_dir}/db2_tprocc_buildschema.tcl
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
echo "CHECK HAMMERDB SCHEMA"
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
${home_dir}/hammerdbcli auto ./scripts/tcl/db2/${cur_dir}/db2_tprocc_checkschema.tcl
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
echo "RUN HAMMERDB TEST"
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
${home_dir}/hammerdbcli auto ./scripts/tcl/db2/${cur_dir}/db2_tprocc_run.tcl
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
echo "DROP HAMMERDB SCHEMA"
${home_dir}/hammerdbcli auto ./scripts/tcl/db2/${cur_dir}/db2_tprocc_deleteschema.tcl
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
echo "HAMMERDB RESULT"
${home_dir}/hammerdbcli auto ./scripts/tcl/db2/${cur_dir}/db2_tprocc_result.tcl

为便于操作,将上述脚本折成三个:

  • 01.build.sh
export TMP=`pwd`/TMP
mkdir -p $TMP

home_dir=/opt/HammerDB-5.0
cur_dir=tprocc_1

echo "BUILD HAMMERDB SCHEMA"
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
${home_dir}/hammerdbcli auto ./scripts/tcl/db2/${cur_dir}/db2_tprocc_buildschema.tcl 
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
echo "CHECK HAMMERDB SCHEMA"
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
${home_dir}/hammerdbcli auto ./scripts/tcl/db2/${cur_dir}/db2_tprocc_checkschema.tcl
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
  • 02.check.sh
export TMP=`pwd`/TMP
mkdir -p $TMP

home_dir=/opt/HammerDB-5.0
cur_dir=tprocc_1

echo "CHECK HAMMERDB SCHEMA"
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
${home_dir}/hammerdbcli auto ./scripts/tcl/db2/${cur_dir}/db2_tprocc_checkschema.tcl
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
  • 03.run.sh
export TMP=`pwd`/TMP
mkdir -p $TMP

home_dir=/opt/HammerDB-5.0
cur_dir=tprocc_1

echo "RUN HAMMERDB TEST"
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
${home_dir}/hammerdbcli auto ./scripts/tcl/db2/${cur_dir}/db2_tprocc_run.tcl 
echo "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-"
echo "HAMMERDB RESULT"
${home_dir}/hammerdbcli auto ./scripts/tcl/db2/${cur_dir}/db2_tprocc_result.tcl 

3.执行基准测试

对HammerDB的脚本处理完成之后,按以下步骤执行基准测试:

  • 执行01.build.sh,加载测试数据,这个过程十分漫长,建议使用nohup后台执行;
  • 执行02.check.sh,检查数据是否有问题,有概率在上一步骤加载测试数据量不足,导致check失败;
  • 执行03.rub.sh,按print dict中tpc-c的基准测试,会启动虚拟用户执行共1000万个事务操作,在操作完成输出以下测试结果:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
HAMMERDB RESULT
HammerDB CLI v5.0
Copyright © HammerDB Ltd hosted by tpc.org 2019-2025
Type "help" for a list of commands
Usage: hammerdbcli [ tcl|python [ auto [ script_to_autoload.[ tcl|py ] ] ] ]
Initialized Jobs on-disk database /opt/HammerDB-5.0/scripts/tcl/db2/tprocc_1/TMP/hammer.DB using existing tables (21,528,576 bytes)
TRANSACTION RESPONSE TIMES
{
  "NEWORD": {
    "elapsed_ms": "422550.0",
    "calls": "534990",
    "min_ms": "5.48",
    "avg_ms": "12.077",
    "max_ms": "295.777",
    "total_ms": "6461582.597",
    "p99_ms": "38.842",
    "p95_ms": "23.966",
    "p50_ms": "10.004",
    "sd": "6892.908",
    "ratio_pct": "47.787"
  },
  "PAYMENT": {
    "elapsed_ms": "422550.0",
    "calls": "537522",
    "min_ms": "4.145",
    "avg_ms": "8.669",
    "max_ms": "290.135",
    "total_ms": "4659871.027",
    "p99_ms": "39.027",
    "p95_ms": "18.848",
    "p50_ms": "6.55",
    "sd": "6931.593",
    "ratio_pct": "34.462"
  },
  "SLEV": {
    "elapsed_ms": "422550.0",
    "calls": "53684",
    "min_ms": "3.502",
    "avg_ms": "21.178",
    "max_ms": "790.255",
    "total_ms": "1136955.528",
    "p99_ms": "207.493",
    "p95_ms": "82.497",
    "p50_ms": "4.095",
    "sd": "43340.133",
    "ratio_pct": "8.408"
  },
  "DELIVERY": {
    "elapsed_ms": "422550.0",
    "calls": "54054",
    "min_ms": "7.007",
    "avg_ms": "14.891",
    "max_ms": "146.953",
    "total_ms": "804921.454",
    "p99_ms": "47.6",
    "p95_ms": "28.509",
    "p50_ms": "11.504",
    "sd": "8377.1",
    "ratio_pct": "5.953"
  },
  "OSTAT": {
    "elapsed_ms": "422550.0",
    "calls": "53798",
    "min_ms": "3.959",
    "avg_ms": "6.718",
    "max_ms": "473.926",
    "total_ms": "361443.545",
    "p99_ms": "19.094",
    "p95_ms": "11.394",
    "p50_ms": "6.04",
    "sd": "4680.572",
    "ratio_pct": "2.673"
  }
}

TRANSACTION COUNT
{"Db2 tpm": {
    "2025-07-17 14:27:18": "0",
    "2025-07-17 14:27:28": "113286",
    "2025-07-17 14:27:38": "146202",
    "2025-07-17 14:27:48": "171288",
    "2025-07-17 14:27:58": "185664",
    "2025-07-17 14:28:08": "177024",
    "2025-07-17 14:28:18": "173898",
    "2025-07-17 14:28:28": "195030",
    "2025-07-17 14:28:38": "212862",
    "2025-07-17 14:28:48": "215418",
    "2025-07-17 14:28:58": "189684",
    "2025-07-17 14:29:08": "201666",
    "2025-07-17 14:29:18": "223284",
    "2025-07-17 14:29:28": "226416",
    "2025-07-17 14:29:38": "225492",
    "2025-07-17 14:29:48": "227562",
    "2025-07-17 14:29:58": "223902",
    "2025-07-17 14:30:08": "198942",
    "2025-07-17 14:30:18": "172146",
    "2025-07-17 14:30:28": "183276",
    "2025-07-17 14:30:38": "157728",
    "2025-07-17 14:30:48": "151374",
    "2025-07-17 14:30:58": "146904",
    "2025-07-17 14:31:08": "143670",
    "2025-07-17 14:31:18": "135030",
    "2025-07-17 14:31:28": "61764",
    "2025-07-17 14:31:38": "66630",
    "2025-07-17 14:31:48": "99150",
    "2025-07-17 14:31:58": "118314",
    "2025-07-17 14:32:08": "125604",
    "2025-07-17 14:32:18": "124164",
    "2025-07-17 14:32:28": "134502",
    "2025-07-17 14:32:38": "134886",
    "2025-07-17 14:32:48": "157632",
    "2025-07-17 14:32:58": "185616",
    "2025-07-17 14:33:08": "182790",
    "2025-07-17 14:33:18": "192768",
    "2025-07-17 14:33:28": "209472",
    "2025-07-17 14:33:38": "215172",
    "2025-07-17 14:33:48": "192120",
    "2025-07-17 14:33:58": "149550",
    "2025-07-17 14:34:08": "110724",
    "2025-07-17 14:34:18": "158910"
  }}

HAMMERDB RESULT
[
  "687897C319BD03E233632343",
  "2025-07-17 14:27:15",
  "16 Active Virtual Users configured",
  "TEST RESULT : System achieved 36337 NOPM from 160255 Db2 TPM"
]

4.总结

最开始研究基于GUI的配置方式,但受限较多,且GUI很卡顿难以为继,通过修改HammerDB自带的脚本还是很方便进行基准测试的,修改参数也很方便,至于基准测试结果的解读,放到下次说明。

posted @ 2025-07-17 14:58  潇雨锁清秋  阅读(40)  评论(0)    收藏  举报