暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

达梦数据库部署和性能测试实践

10283

  


本文主要分享国产数据库达梦数据库的部署、BenchmarkSQL 和 sysbench 性能测试以及在可计算存储 CSD 上的性能表现。部署过程比较细节篇幅较长,可以直接跳到尾部看总结。由于使用不多,可能有些理解不当,欢迎交流指出。



 

达梦数据库简介

 
武汉达梦数据库股份有限公司成立于2000年,为中国电子信息产业集团(CEC)旗下基础软件企业,致力于数据库管理系统与大数据平台的研发、销售和服务,同时可为用户提供全栈数据产品和解决方案。
多年来,达梦公司始终坚持原始创新、独立研发,目前已掌握数据管理与数据分析领域的核心前沿技术,拥有全部源代码,具有完全自主知识产权。
 


部署数据库

 

下载

 
官网下载地址:https://www.dameng.com/list_103.html
官网文档地址:https://eco.dameng.com/docs/zh-cn/pm/index.html?source_url=https://www.dameng.com/list_103.html
 
达梦数据库支持多种 CPU 架构和操作系统,这里我选择 x86 和 CentOS7 系统,下载软件并解压缩。
 
[dmdba@sfx111188 soft]$ wget https://package.dameng.com/eco/adapter/dm/dm8/dm8_20210712_x86_rh6_64_ent.zip
[dmdba@sfx111188 soft]$ ls -lrth dm8_20210712_x86_rh6_64_ent.zip
-rw-r--r-- 1 root root 716M Mar 18 15:50dm8_20210712_x86_rh6_64_ent.zip
unzip dm8_20210712_x86_rh6_64_ent.zip
[dmdba@sfx111188 soft]$ cd dm8_20210712_x86_rh6_64_ent && ls-lrth
total 727M
-rw-r--r-- 1 root root 727M Aug 12 2021 dm8_20210712_x86_rh6_64_ent_8.1.2.38_pack1.iso
-rw-r--r-- 1 root root  169Aug 12  2021dm8_20210712_x86_rh6_64_ent_8.1.2.38_pack1.iso_SHA256.txt
 
安装文件是iso 文件,可以挂载到本地目录
[dmdba@sfx11118 dm8_20210712_x86_rh6_64_ent]$ 
mkdir -p disk
mount -o loop dm8_20210712_x86_rh6_64_ent_8.1.2.38_pack1.iso disk
df -h |grep disk
/dev/loop0              727M  727M     0 100% disk
 

部署规划

安装之前简单规划一下。
内存:主机内存128G,数据库BUFFER POOL 60G 。数据库还会有些其他内存需求,以及主机后面要跑测试程序也需要一些内存。
磁盘:安装目录都放在NVME 接口的SSD盘上,这里选择的是ScaleFlux CSD 2000 。路径 data/
 
[root@sfx111188 ~]# lsblk dev/sfdv1n1
NAME    MAJ:MIN  RM SIZE RO TYPE MOUNTPOINT
sfdv1n1 252:8192  0  3.5T  0disk data
[root@sfx111188 ~]#
 
用户:达梦数据库默认会安装在用户 dmdba 下,如果用户不存在会自动创建(用户组为dinstall);如果用户存在,就会修改这个用户组设置。
安装目录:/opt/dmdbms
相关软件:安装文档里提到的必装软件,这里都安装了,就略过不提。
 
 

卸载方法(可选)

 
初次安装一个数据库,不一定能一次性成功,免不了要反复尝试。再次尝试的时候用官方的卸载方法可以保证卸载干净。
 
[dmdba@sfx111188 dmdbms]$ ./uninstall.sh -i
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Check the DMDBMS installed by root, if uninstall by that is notroot, maybe has some files to remain. if the DMDBMS is installed by that is notroot, please continue to run the uninstall program.
Whether continue to run the uninstall program? (y/Y:Yes n/N:No):y
 
Whether to uninstall DM database(/opt/dmdbms/)? (y/Y:Yes n/N:No):y
 
Whether to deletet the dm_svc.conf file? (y/Y:Yes n/N:No):y
 
Uninstalling database directorys
Uninstalling bin directory
Uninstall bin directory completed
Uninstalling bin2 directory
Uninstall bin2 directory completed
Uninstalling include directory
Uninstall include directory completed
Uninstalling desktop directory
Uninstall desktop directory completed
Uninstalling doc directory
Uninstall doc directory completed
Uninstalling drivers directory
Uninstall drivers directory completed
Uninstalling jdk directory
Uninstall jdk directory completed
Uninstalling jar directory
Uninstall jar directory completed
Uninstalling samples directory
Uninstall samples directory completed
Uninstalling script directory
Uninstall script directory completed
Uninstalling tool directory
Uninstall tool directory completed
Uninstalling web directory
Uninstall web directory completed
Uninstalling uninstall directory
Uninstall uninstall directory completed
Uninstalling license_en.txt file
Uninstall license_en.txt file completed
Uninstalling license_zh.txt file
Uninstall license_zh.txt file completed
Uninstalling uninstall.sh file
Uninstall uninstall.sh file completed
Uninstall database directorys completed
 
Execute the command by "root":
/opt/dmdbms/root_uninstaller.sh
[dmdba@sfx111188 dmdbms]$
 

开始安装软件

 
进入安装镜像文件目录,里面有安装文件和文档。非常简单。
 
[root@sfx111188 disk]# cd disk
[root@sfx111188 disk]# ls -lrth
total 727M
-r-xr-xr-x 1 root root 2.7M Jul 11 2021 DM8 Install.pdf
-r-xr-xr-x 1 root root 724M Jul 11 2021 DMInstall.bin
[root@sfx111188 disk]#
 
安装会有多种模式,这里选择不要 key自定义安装
安装命令就是 DMInstall.bin -i 即可。
 
[root@sfx111188 disk]# ./DMInstall.bin -i
请选择安装语言(C/c:中文 E/e:英文) [C/c]:e
Extract install files..........
Welcome to DM DBMS Installer
 
Whether to input the path of Key File? (Y/y:Yes N/n:No) [Y/y]:n
 
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Whether to Set The TimeZone? (Y/y:Yes N/n:No) [Y/y]:n
 
Installation Type:
1 Typical
2 Server
3 Client
4 Custom
Please Input the number of the Installation Type [1 Typical]:4
1 Server component
2 Client component
  2.1 Manager
  2.2 Monitor
  2.3 DTS
  2.4 Console
  2.5 Analyzer
  2.6 DISQL
3 DM Drivers
4 Manual component
5 DBMS Service
  5.1 Realtime Audit Service
  5.2 Job Service
  5.3 Instance MonitorService
  5.4 Assistant Plug-InService
Please Input the number of the Installation Type [1 2 3 4 5]:
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Require Space: 1181M
 
Please Input the install path [/opt/dmdbms]:
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Available Space:11G
Please Confirm the install path(/opt/dmdbms)? (Y/y:Yes N/n:No)[Y/y]:y
 
Pre-Installation Summary
Installation Location: opt/dmdbms
Require Space: 1181M
Available Space: 11G
Version Information:
Expire Date:
Installation Type: Custom
Confirm to Install? (Y/y:Yes N/n:No):y
 
File etc/dm_svc.conf exist, replace it? (Y/y,N/n) [Y/y]:y
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
2022-03-19 10:56:18
[INFO] Installing DM DBMS...
2022-03-19 10:56:18
[INFO] Installing BASE Module...
2022-03-19 10:56:20
[INFO] Installing SERVER Module...
2022-03-19 10:56:20
[INFO] Installing CLIENT Module...
2022-03-19 10:56:21
[INFO] Installing DRIVERS Module...
2022-03-19 10:56:21
[INFO] Installing MANUAL Module...
2022-03-19 10:56:21
[INFO] Installing SERVICE Module...
2022-03-19 10:56:22
[INFO] Move log file to log directory.
2022-03-19 10:56:22
[INFO] Change the power of installtion directory successfully.
2022-03-19 10:56:23
[INFO] Installed DM DBMS completely.
 
End

注意,这一步只是安装软件。
 

初始化数据库

 
达梦数据库的可执行文件在安装目录的 bin 目录下。可以将这个目录加入到用户 dmdba PATH环境变量里。

初始化数据库目录。

使用命令 dminit 初始化数据库目录。具体请使用帮助参考文档:https://eco.dameng.com/docs/zh-cn/pm/use-dminit.html
 
初始化时指定数据库页大小为32KB。这个相比 ORACLE 8K 页大小而言比较大。初始化时指定数据库的顶层目录。这里放在 CSD 盘上。
[dmdba@sfx111188 dmdbms]$ bin/dminit path=/data page_size=32 extent_size=32
initdb V8
db version: 0x7000c
file dm.key not found, use default license!
License will expire on 2022-07-09
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
 
 log file path:/data/DAMENG/DAMENG01.log
 
 
 log file path:/data/DAMENG/DAMENG02.log
 
write to dir [/data/DAMENG].
create dm database success. 2022-03-19 11:04:54


查看初始化后的目录。
[dmdba@sfx111188 dmdbms]$ tree data/DAMENG/
/data/DAMENG/
|-- DAMENG01.log
|-- DAMENG02.log
|-- HMAIN
|-- MAIN.DBF
|-- ROLL.DBF
|-- SYSTEM.DBF
|-- bak
|-- ctl_bak
|   `--dm_20220319110454_073687.ctl
|-- dm.ctl
|-- dm.ini
|-- dm_service.prikey
|-- dminit20220319110451.log
`-- sqllog.ini
 
3 directories, 11 files
 

修改数据库配置文件

 

达梦数据库配置文件 dm.ini 在数据库初始化目录里。严格来说要将下面参数一一修改。这里用了简单的方法,把要修改的参数放在文件末尾。

 
[dmdba@sfx111188 dmdbms]$ vim data/DAMENG/dm.ini +$
ADAPTIVE_NPLN_FLAG=0
BDTA_SIZE=16
BTR_SPLIT_MODE=1
BUFFER=60000
BUFFER_POOLS=100
CACHE_POOL_SIZE=1000
CASE_WHEN_CVT_IFUN=5
CKPT_DIRTY_PAGES=0
CKPT_INTERVAL=60
CKPT_RLOG_SIZE=0
CLOB_LIKE_MAX_LEN=31
COMM_VALIDATE=0
CONCURRENT_DELAY=12
DECIMAL_FIX_STORAGE=1
DICT_BUF_SIZE=1000
ENABLE_FREQROOTS=1
ENABLE_HASH_JOIN=0
ENABLE_HUGE_SECIND=0
ENABLE_IN_VALUE_LIST_OPT=1
ENABLE_MONITOR=0
ENABLE_SPACELIMIT_CHECK=0
FAST_COMMIT=99
FAST_POOL_PAGES=99999
FAST_RELEASE_SLOCK=0
FAST_ROLL_PAGES=3000
FAST_RW_LOCK=2
FIRST_ROWS=16
FORCE_FLUSH_PAGES=0
GROUP_OPT_FLAG=0
HAGR_DISTINCT_OPT_FLAG=0
HASH_PLL_OPT_FLAG=2
HUGE_BUFFER=8
IO_THR_GROUPS=64
LIKE_OPT_FLAG=7
LOG_BUF_SIZE=512
LOG_POOL_SIZE=128
MAX_BUFFER=150000
#MAX_CONCURRENT_TRX=180
MAX_CONCURRENT_TRX=0
MAX_SESSIONS=10000
MAX_SESSION_STATEMENT=10000
MEMORY_MAGIC_CHECK=0
MEMORY_POOL=500
MPP_UPD_DEL_OPT=1
NOWAIT_WHEN_UNIQUE_CONFLICT=1
PARALLEL_PURGE_FLAG=1
PSEG_RECV=1
PURGE_DEL_OPT=2
PURGE_WAIT_TIME=0
RECYCLE=8
RECYCLE_POOLS=1
RLOG_BUF_SIZE=512
RLOG_PARALLEL_ENABLE=1
RLOG_POOL_SIZE=128
SESS_CHECK_INTERVAL=30
SESS_POOL_SIZE=1024
TRX_VIEW_MODE=1
TRX_VIEW_SIZE=512
UNDO_EXTENT_NUM=32
UNDO_RETENTION=0.200000
UPD_DEL_OPT=1
VIEW_FILTER_MERGING=2
VM_MEM_HEAP=1
VM_POOL_SIZE=512
WORKER_THREADS=64
WORK_THRD_STACK_SIZE=1024
ENABLE_MONITOR_BP=0
TEMP_SIZE=1024
MVCC_RETRY_TIMES=10
 

上面参数有个要注意:

  • BUFFERS 是指定数据库内存的主要部分的大小,这里设置为60000(单位MB)。

  • MAX_SESSIONS 是指定最大会话数,默认值太小(100),这里设置为10000。设置过小会导致后面高并发压测时出现数据库连接失败。




 

启动数据库实例

 

数据库初始化后,在root下注册一下数据库服务。

[root@sfx111188 ~]# /opt/dmdbms/script/root/dm_service_installer.sh-t dmserver -dm_ini data/DAMENG/dm.ini -p DMSERVER
 
[dmdba@sfx111188 dmdbms]$ ls bin/DmServiceDMSERVER3
bin/DmServiceDMSERVER3
[dmdba@sfx111188 dmdbms]$ bin/DmServiceDMSERVER3 start
Starting DmServiceDMSERVER3:                               [ OK ]
 
 

如果不注册服务,就在 dmdba下手动启动数据库服务也行。

 
cd opt/dmdbms
nohup bin/dmserver data/DAMENG/dm.ini 2>&1 1>dmdbms.log&
 

推荐注册数据库服务。单机安装多个达梦数据库实例时,可以注册多个不重名的数据库服务,方便管理。

运行一段时间后,数据库服务器启动成功,监听端口5236

 
[dmdba@sfx111188 dmdbms]$ netstat -ntlp |grep dmserver
(Not all processes could be identified, non-owned process info
 will not be shown, you wouldhave to be root to see it all.)
tcp6       0      0 :::5236                 :::*                    LISTEN      69818/bin/dmserver
 

开启AWR报表(可选)

 AWR 报表是数据库性能指标的一个快照,对分析过去某个时间段内的性能变化非常有帮助。


达梦实例连接命令使 disql,默认管理员用户和密码如下。下面初始化报表默认对象,配置采集间隔,以及演示手动采集性能快照和生成报表方法。

[dmdba@sfx111188 dmdbms]$ bin/disql SYSDBA/SYSDBA
 
Server[LOCALHOST:5236]:mode is normal, state is open
login used time : 1.072(ms)
disql V8
SQL> SP_INIT_AWR_SYS(1);
SP_INIT_AWR_SYS(1);
[-3401]:tablespace [SYSAUX] is already exist
-3401: anonymous block line 16 .
used time: 13.802(ms). Execute id is 0.
 
SQL> DBMS_WORKLOAD_REPOSITORY.AWR_SET_INTERVAL(30);
DMSQL executed successfully
used time: 27.980(ms). Execute id is 310363315.
SQL> DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
DMSQL executed successfully
used time: 00:00:02.483. Execute id is 310363316.
SQL> DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
DMSQL executed successfully
used time: 844.433(ms). Execute id is 310363317.
SQL> SELECT * FROM SYS.WRM$_SNAPSHOT;
 
LINEID     SNAP_ID     DBID       INSTANCE_NUMBER STARTUP_TIME               BEGIN_INTERVAL_TIMEEND_INTERVAL_TIME          SNAP_LEVEL
---------- ----------- ----------- ----------------------------------------- ------------------- -------------------------------------
1          1           NULL        1               2022-03-21 11:13:35.000000NULL                2022-03-2112:00:40.000000 1
2          2           NULL        1               2022-03-21 11:13:35.000000 NULL                2022-03-21 12:00:49.000000 1

SQL>CALL SYS.AWR_REPORT_HTML(1,2,'/tmp','awr1.html');

DMSQL executed successfully

used time: 170.755(ms). Execute id is 1403.

SQL>


 


测试数据库


TPC-C 简介


TPC-C是衡量联机事务处理(OLTPOnlineTransaction Processing)系统的工业标准,是行业中公认的权威和最为复杂的在线事务处理基准测试。它通过模拟仓库和订单管理系统,测试广泛的数据库功能,包括查询、更新和 mini-batch事务(队列式小批量事务)。
  
TPC-C 的测试方法就是指定业务仓库表的数据量。其他表的数据规模都是基于仓库表按比例扩张,彼此有业务逻辑。测试结果也就一个输出:tpmC ,每分钟创建订单数。配置文件里有各种业务场景的比例,这个通常保持不变。
 
TPC-C 的优点是有业务场景,比较接近客户交易场景业务。测试执行也简单(变量少)。缺点是理解稍微有点难度。
 

部署BenchmarkSQL

 
根据官方文档介绍的测试环境,本文中涉及的TPC-C测试将使用 BenchmarkSQL5.0 软件实现。BenchmarkSQL是一款基于JDBC实现的类似于OLTPTPC-C标准测试工具,目前支持的数据库如:PostgreSQLOracle等。
 

下载&编译安装

 

BenchmarkSQL 可以从github里搜索下载。

 

需要修改文件 jTPCC.java 增加数据库类型 dameng


 
vim src/client/jTPCC.java
 
117     if(iDB.equals("firebird"))
118         dbType =DB_FIREBIRD;
119     else if(iDB.equals("oracle"))
120         dbType =DB_ORACLE;
121     else if(iDB.equals("postgres"))
122         dbType =DB_POSTGRES;
123     else if(iDB.equals("dameng"))
124         dbType =DB_UNKNOWN;
125     else
126     {
127        log.error("unknown database type '" + iDB + "'");
128         return;
129     }
 

使用ant 编译。

 
[root@sfx111188 benchmarksql-5.0]# ant
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Buildfile: root/benchmarksql-5.0/build.xml
 
init:
 
compile:
    [javac] Compiling 11source files to root/benchmarksql-5.0/build
 
dist:
      [jar] Building jar:/root/benchmarksql-5.0/dist/BenchmarkSQL-5.0.jar
 
BUILD SUCCESSFUL
Total time: 0 seconds
 

修改 run/funcs.sh,增加 dameng 数据库类型的驱动类文件目录。

 
 25 function setCP()
 26 {
 27     case "$(getProp db)" in
 28     firebird)
 29        cp="../lib/firebird/*:../lib/*"
 30         ;;
 31     oracle)
 32         cp="../lib/oracle/*"
 33         if [ ! -z "${ORACLE_HOME}"-a -d ${ORACLE_HOME}/lib ] ; then
 34        cp="${cp}:${ORACLE_HOME}/lib/*"
 35         fi
 36         cp="${cp}:../lib/*"
 37         ;;
 38     postgres)
 39        cp="../lib/postgres/*:../lib/*"
 40         ;;
 41     dameng)
 42         cp="../lib/dm/*:../lib/*"
 43         ;;
 44     esac
 45     myCP=".:${cp}:../dist/*"
 46     export myCP
 47 }
 
 

配置达梦数据库连接

 

BenchmarkSQL JAVA 开发的,连接达梦数据库必须使用达梦8JDBC驱动。驱动文件在安装目录的drivers 目录下。

 
mkdir ~/benchmarksql-5.0/lib/dm/
cp opt/dmdbms/drivers/jdbc/DmJdbcDriver18.jar~/benchmarksql-5.0/lib/dm/
 
  • 达梦数据库连接配置文件。
[root@sfx111188 run]# pwd
/root/benchmarksql-5.0/run
[root@sfx111188 run]# vim props.dm
db=dameng
driver=dm.jdbc.driver.DmDriver
conn=jdbc:dm://sfx111188:5236
user=tpcc
password=123456789
 
warehouses=10000
loadWorkers=25
 
terminals=100
//To run specified transactions per terminal- runMins must equalzero
runTxnsPerTerminal=0
//To run for specified minutes- runTxnsPerTerminal must equal zero
runMins=10
//Number of total transactions per minute
limitTxnsPerMin=0
 
//Set to true to run in 4.x compatible mode. Set to false to usethe
//entire configured database evenly.
terminalWarehouseFixed=true
 
//The following five values must add up to 100
//The default percentages of 45, 43, 4, 4 & 4 match the TPC-Cspec
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4
 
// Directory name to create for collecting detailed result data.
// Comment this out to suppress.
//resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
//osCollectorScript=./misc/os_collector_linux.py
//osCollectorInterval=1
//osCollectorSSHAddr=user@dbhost
//osCollectorDevices=net_eth0 blk_sda
 

配置文件指定 TPC-C 仓库数为 10000 仓。

 

创建用户和表空间

 
  • 连接达梦数据库
[dmdba@sfx111188 dmdbms]$ disql SYSDBA/SYSDBA
 
Server[LOCALHOST:5236]:mode is normal, state is open
login used time : 1.286(ms)
disql V8
SQL>
 
  • 建表空间

给表空间文件单独一个目录,方便管理。

[dmdba@sfx111188 DAMENG]$ mkdir data/DAMENG/tpcc
 
 

连接数据库,建表空间。表空间文件默认有自动扩展属性,为了最大化 IO 性能,这里还是手动创建多个数据文件。

 
CREATE TABLESPACE BENCHMARKSQL DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL1.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL2.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL3.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL4.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL5.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL6.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL7.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL8.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL9.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL10.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL11.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL12.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL13.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL14.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL15.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL16.dbf' SIZE 100000;
ALTER TABLESPACE BENCHMARKSQL ADD DATAFILE '/data/DAMENG/tpcc/BENCHMARKSQL17.dbf' SIZE 100000;
 

表空间数据文件初始化为指定大小,实际在CSD 2000 内部并不分配存储。可以通过命令确认。

 

[root@sfx111188 ~]# sfx-filesize -h data/DAMENG/tpcc/*.dbf |grep .
  Logical  Alocated Physical   Ratio File
   97.66G    97.66G    2.80K 36612290.50 data/DAMENG/tpcc/BENCHMARKSQL1.dbf
  Logical  Alocated Physical   Ratio File
   97.66G    97.66G    1.62K 63015384.62 data/DAMENG/tpcc/BENCHMARKSQL10.dbf
<……>
  Logical  Alocated Physical   Ratio File
   97.66G    97.66G    1.62K 63015384.62 data/DAMENG/tpcc/BENCHMARKSQL9.dbf

备注:命令 sfx-filesize 是 CSD 2000 提供的命令,用于查看文件在 CSD 内部实际分配空间以及当前 CSD 压缩比(公式:文件系统里的逻辑大小 CSD 内部实际物理大小)。


  • 建用户
 
DROP USER TPCC CASCADE;
CREATE USER TPCC IDENTIFIED BY "123456789";
GRANT DBA TO TPCC;
ALTER USER TPCC DEFAULT TABLESPACE BENCHMARKSQL;
 

测试用户连接。

[dmdba@sfx111188 dmdbms]$ disql tpcc/123456789
 
Server[LOCALHOST:5236]:mode is normal, state is open
login used time : 1.183(ms)
disql V8
SQL>
 

创建数据库对象

 
  • 建表

建表语句,大部分表采用分区表,使用 hash 分区,并且指定表的 FILLFACTOR(填充因子)为50。


[root@sfx111188 run]# mkdir sql.dameng
vim dameng/create_tables.sql

create table TPCC.bmsql_config (
cfg_name    varchar(30) cluster primarykey,
cfg_value   varchar(50)
);
create table TPCC.BMSQL_WAREHOUSE (
w_id        integer   notnull,
w_ytd       decimal(12,2),
w_tax       decimal(12,2),
w_name      varchar(10),
w_street_1  varchar(20),
w_street_2  varchar(20),
w_city      varchar(20),
w_state     char(2),
w_zip       char(9),
cluster primary key(w_id)
)
PARTITION BY hash(w_id) partitions 100
storage(FILLFACTOR 50 );
 
create table TPCC.bmsql_district (
d_w_id       integer       notnull,
d_id         integer       notnull,
d_ytd        decimal(12,2),
d_tax        decimal(12,2),
d_next_o_id  integer,
d_name       varchar(10),
d_street_1   varchar(20),
d_street_2   varchar(20),
d_city       varchar(20),
d_state      char(2),
d_zip        char(9),
cluster primary key(d_w_id, d_id))
PARTITION BY hash(d_w_id) partitions 100
storage(FILLFACTOR 50 );
 
create table TPCC.bmsql_customer (
c_w_id         integer        notnull,
c_d_id         integer        notnull,
c_id           integer        notnull,
c_discount     decimal(12,2),
c_credit       char(2),
c_last         varchar(16),
c_first        varchar(16),
c_credit_lim   decimal(12,2),
c_balance      decimal(12,2),
c_ytd_payment  decimal(12,2),
c_payment_cnt  integer,
c_delivery_cnt integer,
c_street_1     varchar(20),
c_street_2     varchar(20),
c_city         varchar(20),
c_state        char(2),
c_zip          char(9),
c_phone        char(16),
c_since        timestamp,
c_middle       char(2),
c_data         varchar(500),
cluster primary key(c_w_id,c_d_id, c_id))
PARTITION BY hash(c_w_id) partitions 100
storage(FILLFACTOR 50 );
 
create table TPCC.bmsql_history (
hist_id  integer,
h_c_id   integer,
h_c_d_id integer,
h_c_w_id integer,
h_d_id   integer,
h_w_id   integer,
h_date   timestamp,
h_amount decimal(12,2),
h_data   varchar(24)
)
PARTITION BY hash(h_c_w_id) partitions 100
storage(FILLFACTOR 50);
 
create table TPCC.bmsql_oorder (
o_w_id       integer      notnull,
o_d_id       integer      notnull,
o_id         integer      notnull,
o_c_id       integer,
o_carrier_id integer,
o_ol_cnt     decimal(12,2),
o_all_local  decimal(12,2),
o_entry_d    timestamp,
cluster primary key(o_w_id,o_d_id, o_id)
)
PARTITION BY hash(o_w_id) partitions 100
storage(FILLFACTOR 50);
 
create table TPCC.bmsql_new_order (
no_w_id  integer   notnull,
no_d_id  integer   notnull,
no_o_id  integer   notnull,
cluster primary key(no_w_id,no_d_id, no_o_id)
)
PARTITION BY hash(no_w_id) partitions 100
storage(FILLFACTOR 50);
 
create table TPCC.bmsql_order_line (
ol_w_id         integer   notnull,
ol_d_id         integer   notnull,
ol_o_id         integer   notnull,
ol_number       integer   notnull,
ol_i_id         integer   notnull,
ol_delivery_d   timestamp,
ol_amount       decimal(12,2),
ol_supply_w_id  integer,
ol_quantity     decimal(12,2),
ol_dist_info    char(24),
cluster primary key(ol_w_id,ol_d_id, ol_o_id, ol_number)
)
PARTITION BY hash(ol_w_id) partitions 100
storage(FILLFACTOR 50);
 
create table TPCC.bmsql_stock (
s_w_id       integer       notnull,
s_i_id       integer       notnull,
s_quantity   decimal(12,2),
s_ytd        decimal(12,2),
s_order_cnt  integer,
s_remote_cnt integer,
s_data       varchar(50),
s_dist_01    char(24),
s_dist_02    char(24),
s_dist_03    char(24),
s_dist_04    char(24),
s_dist_05    char(24),
s_dist_06    char(24),
s_dist_07    char(24),
s_dist_08    char(24),
s_dist_09    char(24),
s_dist_10    char(24),
cluster primary key(s_w_id,s_i_id)
)
PARTITION BY hash(s_w_id) partitions 100
storage(FILLFACTOR 50);
 
create table TPCC.bmsql_item (
i_id     integer      notnull,
i_name   varchar(24),
i_price  decimal(12,2),
i_data   varchar(50),
i_im_id  integer,
cluster primary key(i_id)
);
create index idx_customer_name on tpcc.BMSQL_customer(c_w_id, c_d_id, c_last, c_first);
create or replace procedure tpcc.createsequence
as
 n int;
 stmt1 varchar(200);
 begin
   selectcount(*)+1into n from BMSQL_history;
   if(n != 1) then
      selectmax(hist_id) + 1into n from BMSQL_history;
   endif;
   PRINT n;
   stmt1:='create sequence hist_id_seq start with '||n||' MAXVALUE9223372036854775807 CACHE 50000;';
   EXECUTE IMMEDIATE stmt1;
end;
/
call tpcc.createsequence;
alter table tpcc.BMSQL_history modify hist_id integer default (tpcc.hist_id_seq.nextval);
[root@sfx111188 run]# sh runSQL.sh props.dmsql.dameng/create_tables.sql
 

加载TPC-C数据

 
[root@sfx111188 run]# sh runLoader.sh props.dm
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Starting BenchmarkSQL LoadData
 
driver=dm.jdbc.driver.DmDriver
conn=jdbc:dm://sfx111188:5236
user=tpcc
password=***********
warehouses=10000
loadWorkers=25
fileLocation (not defined)
csvNullValue (not defined - using default 'NULL')
 
Worker 000: Loading ITEM
Worker 001: Loading Warehouse     1
Worker 002: Loading Warehouse     2
……
 
 
 

数据大小分析

 
  • 数据量

抽查三个表

SQL> select count(*) from bmsql_warehouse;
 
LINEID     COUNT(*)
---------- --------------------
1          10000
 
used time: 31.668(ms). Execute id is 400.
SQL> select count(*) from bmsql_item;
 
LINEID     COUNT(*)
---------- --------------------
1          100000
 
used time: 2.252(ms). Execute id is 401.
SQL> select count(*) from bmsql_oorder;
 
LINEID     COUNT(*)
---------- --------------------
1          300000000
 
used time: 26.892(ms). Execute id is 402.
SQL> select count(*) from bmsql_order_line;
 
LINEID     COUNT(*)
---------- --------------------
1          2999967798
 
表空间利用率。刚好基本上所有数据文件都接近写满状态。

SELECT F.TABLESPACE_NAME,
       ROUND((T.TOTAL_SPACE- F.FREE_SPACE) 1024) "USED (GB)",
       ROUND(F.FREE_SPACE 1024) "FREE (GB)",
       ROUND(T.TOTAL_SPACE/ 1024"TOTAL(GB)",
       (ROUND((F.FREE_SPACE/ T.TOTAL_SPACE) * 100)) ||  '% ' PER_FREE
  FROM (SELECT TABLESPACE_NAME,
               ROUND(SUM(BLOCKS *
                         (SELECT PARA_VALUE 1024
                            FROM V$DM_INI
                           WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE') 1024)) FREE_SPACE
          FROM DBA_FREE_SPACE
         GROUP BY TABLESPACE_NAME) F,
       (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES 1048576)) TOTAL_SPACE
          FROM DBA_DATA_FILES
         GROUP BY TABLESPACE_NAME) T
 WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME AND T.TABLESPACE_NAME LIKE 'BENCHMARKSQL%';
LINEID     TABLESPACE_NAME USED (GB) FREE (GB)TOTAL(GB) PER_FREE
------------------------- --------- --------- --------- --------
1          BENCHMARKSQL    1666     4         1670     0%
 
 
  • 文件压缩比

数据库目录大小

[root@sfx111188run]# du -sh data/*
1.7T    data/DAMENG
16K     data/lost+found
 
数据初始化完后,数据文件 CSD 压缩比3.00左右。这是数据文件接近写满的状态。实际使用中由于数据文件里没有写满,实际 CSD 压缩比会高于这个。


事务日志文件压缩比在1.86左右。


CSD2000 磁盘压缩比在3.00左右。

 
 

BenchmarkSQL 性能测试


测试准备


达梦数据库数据文件读写都是buffer IO,比较依赖PageCache性能。

在测试之前,清理一下PageCache

echo 3 > proc/sys/vm/drop_caches
 

开始测试

 
[root@sfx111188 run]# sh runBenchmark.sh props.dm
 
21:24:44,868 [main] INFO  jTPCC : Term-00,
21:24:44,869 [main] INFO  jTPCC : Term-00, +-------------------------------------------------------------+
21:24:44,869 [main] INFO  jTPCC : Term-00,      BenchmarkSQLv5.0
21:24:44,869 [main] INFO  jTPCC : Term-00,+-------------------------------------------------------------+
21:24:44,870 [main] INFO  jTPCC : Term-00,  (c) 2003, RaulBarbosa
21:24:44,870 [main] INFO  jTPCC : Term-00,  (c) 2004-2016,Denis Lussier
21:24:44,871 [main] INFO  jTPCC : Term-00,  (c) 2016, JanWieck
21:24:44,871 [main] INFO  jTPCC : Term-00, +-------------------------------------------------------------+
21:24:44,871 [main] INFO  jTPCC : Term-00,
21:24:44,871 [main] INFO  jTPCC : Term-00, db=dameng
21:24:44,871 [main] INFO  jTPCC : Term-00, driver=dm.jdbc.driver.DmDriver
21:24:44,871 [main] INFO  jTPCC : Term-00, conn=jdbc:dm://sfx111188:5236
21:24:44,871 [main] INFO  jTPCC : Term-00, user=tpcc
21:24:44,872 [main] INFO  jTPCC : Term-00,
21:24:44,872 [main] INFO  jTPCC : Term-00, warehouses=10000
21:24:44,872 [main] INFO  jTPCC : Term-00, terminals=64
21:24:44,873 [main] INFO  jTPCC : Term-00, runMins=10
21:24:44,873 [main] INFO  jTPCC : Term-00, limitTxnsPerMin=0
21:24:44,873 [main] INFO  jTPCC : Term-00, terminalWarehouseFixed=true
21:24:44,873 [main] INFO  jTPCC : Term-00,
21:24:44,873 [main] INFO  jTPCC : Term-00, newOrderWeight=45
21:24:44,873 [main] INFO  jTPCC : Term-00, paymentWeight=43
21:24:44,873 [main] INFO  jTPCC : Term-00, orderStatusWeight=4
21:24:44,873 [main] INFO  jTPCC : Term-00, deliveryWeight=4
21:24:44,873 [main] INFO  jTPCC : Term-00, stockLevelWeight=4
21:24:44,873 [main] INFO  jTPCC : Term-00,
21:24:44,873 [main] INFO  jTPCC : Term-00, resultDirectory=null
21:24:44,873 [main] INFO  jTPCC : Term-00, osCollectorScript=null
21:24:44,873 [main] INFO  jTPCC : Term-00,                                                                                                            Term-00,Running Average tpmTOTAL: 1421:34:45,262 [Thread-13] INFO   jTPCC : Term-00, Usage: 780MB / 1616MB                                                                                                                      21:34:45,262[Thread-13] INFO   jTPCC : Term-00,                                                                                                                                           21:34:45,262 [Thread-13]INFO   jTPCC : Term-00, Measured tpmC(NewOrders) = 643077.25                                                                                                     21:34:45,262 [Thread-13] INFO  jTPCC : Term-00, Measured tpmTOTAL = 1428351.01
21:34:45,262 [Thread-13] INFO  jTPCC : Term-00, Session Start    = 2022-03-19 21:24:45
21:34:45,262 [Thread-13] INFO  jTPCC : Term-00, Session End      = 2022-03-19 21:34:45
21:34:45,262 [Thread-13] INFO  jTPCC : Term-00, Transaction Count = 14283890
 

运行结束后会输出当前的 tpmC 值。


部署Sysbench


sysbench 需要下载官方版本,然后编译安装。


编译安装


  • 设置环境变量
export DM_HOME=/opt/dmdbms/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DM_HOME/bin
export PATH=$PATH:$DM_HOME/bin
 
§  配置

编译配置里加上达梦数据库支持 。


chmod +x configure
./configure --without-mysql --with-dm
===============================================================================
sysbench version   : 1.1.0
CC                 : gcc-std=gnu99
CFLAGS             : -O3-funroll-loops  -Wall -Wextra-Wpointer-arith -Wbad-function-cast -Wstrict-prototypes -Wnested-externs-Wno-format-zero-length -Wundef -Wstrict-prototypes -Wmissing-prototypes-Wmissing-declarations -Wredundant-decls -Wcast-align -Wvla   -pthread
CPPFLAGS           :-D_GNU_SOURCE   -I$(top_srcdir)/src-I$(abs_top_builddir)/third_party/luajit/inc-I$(abs_top_builddir)/third_party/concurrency_kit/include
LDFLAGS            :-L/usr/local/lib
LIBS               : -laio-lm
 
prefix             :/usr/local
bindir             :${prefix}/bin
libexecdir         :${prefix}/libexec
mandir             : ${prefix}/share/man
datadir            :${prefix}/share
 
MySQL support      : no
DM support         : yes
PostgreSQL support : no
 
LuaJIT             : bundled
LUAJIT_CFLAGS      : -I$(abs_top_builddir)/third_party/luajit/inc
LUAJIT_LIBS        :$(abs_top_builddir)/third_party/luajit/lib/libluajit-5.1.a -ldl
LUAJIT_LDFLAGS     :-rdynamic
 
Concurrency Kit    : bundled
CK_CFLAGS          :-I$(abs_top_builddir)/third_party/concurrency_kit/include
CK_LIBS            :$(abs_top_builddir)/third_party/concurrency_kit/lib/libck.a
configure flags    :
===============================================================================
 
  • 编译安装

make && make install
 
[root@sfx111188 sysbench-master]# which sysbench
/usr/local/bin/sysbench
 
[root@sfx111188 sysbench-master]# ls /usr/local/share/sysbench/
bulk_insert.lua oltp_delete.lua oltp_point_select.lua oltp_read_write.lua   oltp_update_non_index.lua select_random_points.lua  tests
oltp_common.lua oltp_insert.lua oltp_read_only.lua    oltp_update_index.lua oltp_write_only.lua       select_random_ranges.lua
 
  • 查看帮助

查看 sysbench 命令帮助,包含达梦数据库的连接参数。


[root@sfx111188 sysbench-1.0.14]# sysbench --help |grep dm -B2
 
Compiled-in database drivers:
  dm - dm driver
 
dm options:
  --dm-user=STRING     dm user [SYSDBA]
  --dm-password=STRING dmpassword [SYSDBA]
  --dm-db=STRING       DM database connect url[192.168.105.118:15236]
 
 

创建用户和表空间

 
  • 建表空间

给表空间文件单独一个目录,方便管理。


[dmdba@sfx111188 DAMENG]$ mkdir /data/DAMENG/sysbenchdb
 

连接数据库,建表空间。

 
CREATE TABLESPACE SYSBENCHDB DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb01.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb02.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb03.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb04.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb05.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb06.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb07.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb08.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb09.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADDDATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb10.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb11.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb12.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb13.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb14.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb15.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb16.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb17.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb18.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb19.dbf' SIZE 100000;
ALTER TABLESPACE SYSBENCHDB ADD DATAFILE'/data/DAMENG/sysbenchdb/sysbenchdb20.dbf' SIZE 100000;
CREATE TABLESPACE INDEXTS DATAFILE'/data/DAMENG/sysbenchdb/indexts01.dbf' SIZE 10000;
ALTER TABLESPACE INDEXTS ADD DATAFILE'/data/DAMENG/sysbenchdb/indexts02.dbf' SIZE 10000;
ALTER TABLESPACE INDEXTS ADD DATAFILE'/data/DAMENG/sysbenchdb/indexts03.dbf' SIZE 10000;
ALTER TABLESPACE INDEXTS ADD DATAFILE'/data/DAMENG/sysbenchdb/indexts04.dbf' SIZE 10000;
ALTER TABLESPACE INDEXTS ADD DATAFILE'/data/DAMENG/sysbenchdb/indexts05.dbf' SIZE 10000;
DROP USER TUSER CASCADE;
CREATE USER TUSER IDENTIFIED BY "123456789";
GRANT DBA TO TUSER;
ALTER USER TUSER DEFAULT TABLESPACE SYSBENCHDB;
 

初始化sysbench 数据

 

§  调整建表语句

200行 建表指定 storage(fillfactor 50) 调整索引创建语句,增加 storage 语句,设置 FILLFACTOR 75,以及指定独立的索引表空间。同时把索引创建语句移到建表语句之后插入数据之前。否则后面并行创建索引语句会把临时表空间文件撑大。

 
vim oltp_common.lua +200
 
   elseif drv:name() =="dm"
   then
      ifsysbench.opt.auto_inc then
         id_def ="INTEGER IDENTITY(1,1)"
      else
         id_def ="INTEGER NOT NULL"
      end
     engine_def=" STORAGE( FILLFACTOR 50 ) "
   else
      error("Unsupported databasedriver:" .. drv:name())
   end
 
  print(string.format("Creating table 'sbtest%d'...",table_num))
 
   query = string.format([[
CREATE TABLE sbtest%d(
  id %s,
  k INTEGER DEFAULT '0' NOTNULL,
  c CHAR(120) DEFAULT '' NOTNULL,
  pad CHAR(60) DEFAULT '' NOTNULL,
  %s (id)
) %s %s]],
      table_num, id_def,id_index_def, engine_def,
     sysbench.opt.create_table_options)
 
   con:query(query)
 
   if sysbench.opt.create_secondary then
     print(string.format("Creating a secondary index on'sbtest%d'...",
                          table_num))
     con:query(string.format("CREATE INDEX k_%d ON sbtest%d(k) storage (FILLFACTOR 75, ON INDEXTS) ",
                             table_num, table_num))
   end

   if(sysbench.opt.table_size > 0) then
     print(string.format("Inserting %d records into 'sbtest%d'",
                         sysbench.opt.table_size, table_num))
   end
 
 
  • 初始化数据

初始化50亿数据(50*1亿/表)。48c100G内存机器,大概初始化5小时左右。


cd    /usr/local/share/sysbench/                                        
[root@sfx111188 sysbench]# sysbench oltp_read_write.lua --tables=50 --table-size=100000000 --db-driver=dm--dm-db=sfx111188:5236 --dm-user=TUSER --dm-password=123456789 --auto-inc=1--threads=100 --time=300 --report-interval=60 prepare
 
 

命令跑起来后,迅速查看表结构确认建表语句是正确的。


[dmdba@sfx111188dmdbms]$ bin/disql tuser/123456789
 
Server[LOCALHOST:5236]:modeis normal, state is open
login used time : 3.038(ms)
disql V8
SQL>
select dbms_metadata.get_ddl(OBJECT_TYPE => 'TABLE',NAME=>upper('SBTEST2'),SCHNAME =>'TUSER');
 
LINEID     DBMS_METADATA.GET_DDL(OBJECT_TYPE='TABLE',NAME=UPPER('SBTEST2'),SCHNAME='TUSER')
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1          CREATE TABLE"TUSER"."SBTEST2"
(
"ID" INTEGER IDENTITY(1, 1) NOT NULL,
"K" INTEGER DEFAULT '0' NOT NULL,
"C" CHAR(120) DEFAULT '' NOT NULL,
"PAD" CHAR(60) DEFAULT '' NOT NULL,
CLUSTER PRIMARY KEY("ID")) STORAGE(FILLFACTOR 50, ON "SYSBENCHDB", CLUSTERBTR);
 
used time: 8.129(ms). Execute id is 11802.
 
select table_name,index_name from user_indexes where table_name='SBTEST2';
 
LINEID     TABLE_NAMEINDEX_NAME
---------- ---------- -------------
1          SBTEST2    INDEX33556429
 
select dbms_metadata.get_ddl(OBJECT_TYPE => 'INDEX',NAME=>upper('INDEX33556429'),SCHNAME=> 'TUSER');
 
 
LINEID     DBMS_METADATA.GET_DDL(OBJECT_TYPE='INDEX',NAME=UPPER('INDEX33556429'),SCHNAME='TUSER')
---------- ---------------------------------------------------------------------------------------------------------------------------------
1          CREATE CLUSTERUNIQUE  INDEX "INDEX33556429"ON "TUSER"."SBTEST2"("ID" ASC) STORAGE(FILLFACTOR 50, ON "SYSBENCHDB", CLUSTERBTR);
 
used time: 4.196(ms). Execute id is 11805.
 

运行测试

 
  • 测试之前清理操作系统的PageCache
echo 3 > /proc/sys/vm/drop_caches
sleep 10
 
§  主要测试脚本:oltp_read_only.lua, oltp_write_only.lua , oltp_read_write.lua
§  并发数分别为:1 8 16 32 64 128 256

每次运行脚本如下:

sysbench ${lua} --tables=50 --table-size=100000000 --db-driver=dm--dm-db=sfx111188:5236 --dm-user=TUSER --dm-password=123456789 --auto-inc=1 --threads=${s} --warmup-time=60 --time=300 --report-interval=60 run
 
 

问题记录

 

MVCC 问题

 
369 Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
370 21:34:53,647 [main] INFO   jTPCC : Term-00,
371 21:34:53,649 [main] INFO   jTPCC : Term-00,+-------------------------------------------------------------+
372 21:34:53,649 [main] INFO   jTPCC : Term-00,      BenchmarkSQL v5.0
373 21:34:53,649 [main] INFO   jTPCC : Term-00,+-------------------------------------------------------------+
374 21:34:53,649 [main] INFO   jTPCC : Term-00,  (c) 2003, Raul Barbosa
375 21:34:53,649 [main] INFO   jTPCC : Term-00,  (c) 2004-2016, Denis Lussier
376 21:34:53,651 [main] INFO   jTPCC : Term-00,  (c) 2016, Jan Wieck
377 21:34:53,651 [main] INFO   jTPCC : Term-00,+-------------------------------------------------------------+
378 21:34:53,651 [main] INFO   jTPCC : Term-00,
379 21:34:53,651 [main] INFO   jTPCC : Term-00, db=dameng
380 21:34:53,651 [main] INFO   jTPCC : Term-00,driver=dm.jdbc.driver.DmDriver
381 21:34:53,651 [main] INFO   jTPCC : Term-00,conn=jdbc:dm://sfx111188:5236
382 21:34:53,651 [main] INFO   jTPCC : Term-00, user=tpcc
383 21:34:53,651 [main] INFO   jTPCC : Term-00,
384 21:34:53,651 [main] INFO   jTPCC : Term-00, warehouses=10000
385 21:34:53,651 [main] INFO   jTPCC : Term-00, terminals=128
386 21:34:53,652 [main] INFO   jTPCC : Term-00, runMins=10
387 21:34:53,652 [main] INFO   jTPCC : Term-00, limitTxnsPerMin=0
388 21:34:53,652 [main] INFO   jTPCC : Term-00, terminalWarehouseFixed=true
389 21:34:53,653 [main] INFO   jTPCC : Term-00,
390 21:34:53,653 [main] INFO   jTPCC : Term-00, newOrderWeight=45
391 21:34:53,653 [main] INFO   jTPCC : Term-00, paymentWeight=43
392 21:34:53,653 [main] INFO   jTPCC : Term-00, orderStatusWeight=4
393 21:34:53,653 [main] INFO   jTPCC : Term-00, deliveryWeight=4
394 21:34:53,653 [main] INFO   jTPCC : Term-00, stockLevelWeight=4
395 21:34:53,653 [main] INFO   jTPCC : Term-00,
396 21:34:53,653 [main] INFO   jTPCC : Term-00, resultDirectory=null
397 21:34:53,653 [main] INFO   jTPCC : Term-00, osCollectorScript=null
398 21:34:53,653 [main] INFO   jTPCC : Term-00,
399 21:34:53,809 [main] INFO   jTPCC : Term-00, C value for C_LAST duringload: 197
400 21:34:53,809 [main] INFO   jTPCC : Term-00, C value for C_LAST thisrun:    98
401 21:34:53,810 [main] INFO   jTPCC : Term-00,
402 21:41:19,515 [Thread-76] ERROR  jTPCCTData : Too many mvcc conflict
403 dm.jdbc.driver.DMException: Too many mvcc conflict
404     atdm.jdbc.driver.DBError.throwException(DBError.java:679)
405     atdm.jdbc.b.b.p.F(MSG.java:541)
406     atdm.jdbc.b.b.p.C(MSG.java:501)
407     atdm.jdbc.b.b.p.B(MSG.java:482)
408     atdm.jdbc.b.a.a(DBAccess.java:841)
409     atdm.jdbc.b.a.a(DBAccess.java:346)
410     atdm.jdbc.b.a.a(DBAccess.java:463)
411     atdm.jdbc.driver.DmdbPreparedStatement.executeInner(DmdbPreparedStatement.java:324)
412     at dm.jdbc.driver.DmdbPreparedStatement.do_executeUpdate(DmdbPreparedStatement.java:439)
413     atdm.jdbc.driver.DmdbPreparedStatement.executeUpdate(DmdbPreparedStatement.java:1520)
414     atjTPCCTData.executePayment(jTPCCTData.java:792)
415     at jTPCCTData.execute(jTPCCTData.java:99)
416     atjTPCCTerminal.executeTransactions(jTPCCTerminal.java:160)
417     atjTPCCTerminal.run(jTPCCTerminal.java:88)
418     atjava.lang.Thread.run(Thread.java:750)
 
  • 解决办法

提升 MVCC_RETRY_TIMES 参数值。

 


达梦数据库在可计算存储 CSD 测试

数据库厂商之间的性能测试对比,常用技巧就是尽可能降低 IO 对数据库性能的影响。如小数据集大内存、Redo/Binlog 日志异步落盘。这个能一定程度反映不同数据库之间的能力差异。
本次性能测试主要是比较在相同的数据库(达梦8),相同的数据集下,相同的测试场景下,不同的 SSD 性能差异,负载特点是 IO BOUND。数据集大小远大于数据库内存大小,Redo 日志强制落盘等。这个比较符合生产环境的特点。

服务器配置

  • CPU 48 逻辑核

  • 内存 128G

  • 磁盘:3.8T CSD 2000, 3.8T NVMe SSD标盘


空间压缩比

达梦数据库同样的数据集在普通标盘 SSD 和在 CSD 上使用方式,文件大小等都是一样的,不同的是数据在 CSD 内部的实际分配空间更小。通过 CSD 提供的工具可以查看磁盘整体平均压缩比。下面是 BenchmarkSQL TPC-C 和 SYSBENCH的OLTP 数据集在 CSD 2000上的压缩比,分别为 2.99 和 4.68 。
在前面建表中都将填充因子FILLFACTOR调低到 50,这样表会预留更多的逻辑空间,以提升后期更新性能。这是常用的空间换性能的设计。新增的逻辑空间在 CSD2000 内部并不会分配实际空间,所以并没有浪费 SSD 空间,压缩比也看起来更高一些。


性能对比

下面是在CSD 2000 TLC 和友商TLC 盘上的DM8数据库里运行 sysbench 多个场景测试的性能结果对比。当测试数据具备一定可压缩性时,在高并发下DM8 数据库的性能(吞吐量QPS和平均延时RT等)都能获得不同程度水平的提升(20%~60%)。
 
                   
图: CSD2000跟友商TLC 盘的sysbench 只读场景QPS对比
 
图:CSD2000跟友商TLC 盘的sysbench 只读场景的平均延时对比
 
图:CSD2000跟友商TLC 盘的sysbench 纯写场景的QPS对比
 
图:CSD2000跟友商TLC 盘的sysbench 纯写场景的平均延时对比
 
图:CSD2000跟友商TLC 盘的sysbench 读写混合场景的QPS对比
 
图:CSD2000跟友商TLC 盘的sysbench 读写混合场景的平均延时对比
 


总结

达梦数据库是老牌国产数据库,应该是目前对 ORACLE 功能兼容程度最好的。有单机版本和集群版本(RAC),大部分用户是单机版部署。达梦数据库支持多种硬件平台和操作系统,有 Windows 版本和 Windows 客户端,在开发和运维使用特点上非常像 ORACLE 。在政企很多集中式业务场景替换 ORACLE ,达梦数据库是值得考虑的选择。
达梦数据库的数据模型也是 B-Tree。Page大小默认是 8KB,官方建议是 32KB(更大的Page Size 支持更大的行长),有 FILLFACTOR 设计(这个跟 ORACLE 的 PCTFREE 类似),通过预留更多的空间换取更高的随机更新性能,再使用 CSD 可以达到节省空间和提升性能的双赢目标。
此外,达梦数据库文件的读写是 Buffer IO,这点跟 ORACLE 不同。虽然达梦数据库配置里有 DIRECT IO的选项,不过可能用的不多,官方也不建议用。
梦数据库在 CSD 上的性能提升是符合预期的。BTree 模型的数据页有预留空间,按固定大小对齐,经过文件系统后还要按文件系统块大小(4KB)对齐,在 CSD 内部有大量空间可以被压缩,加上数据自身也有一定可压缩性,所以整体的数据压缩比很高(高于2.9)。CSD 跟普通 SSD区别就是 SSD 多了一层压缩和解压缩功能,当数据在 CSD 内被压缩后,实际 SSD物理空间消耗(NAND)就变少,从而降低 SSD 写放大和降低 GC 的频率和 GC 对业务读写的负面影响等,提升稳态时读写性能。详细原理可以查看下面参考文章。


参考




文章转载自数据库技术闲谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论