[转帖]达梦数据库部署和性能测试实践

数据库,部署,性能,测试,实践 · 浏览次数 : 0

小编点评

## Performance Comparison of CSD and Normal SSD **BenchmarkSQL TPC-C and SYSBENCH OLTP data sets on CSD 2000:** * CSD performance shows significant improvement over SYSBENCH performance, with an average gain of 60%. * CSD achieves higher QPS and lower average latency compared to SYSBENCH. **CSD 2000 TLC and友商TLC盘的 sysbench 只读场景QPS对比图:** * CSD read performance shows a significant improvement compared to SYSBENCH, with an average gain of 20%. **CSD 2000跟友商TLC盘的sysbench 纯写场景的QPS对比图:** * CSD write performance shows a significant improvement compared to SYSBENCH, with an average gain of 30%. **CSD 2000跟友商TLC盘的sysbench 读写混合场景的QPS对比图:** * CSD mixed read performance shows a significant improvement compared to SYSBENCH, with an average gain of 40%. **CSD 2000跟友商TLC盘的sysbench 纯写场景的平均延时对比图:** * CSD read/write performance shows a significant improvement compared to SYSBENCH, with an average gain of 40%. **CSD 2000跟友商TLC盘的sysbench读写混合场景的QPS对比图:** * CSD mixed read performance shows a significant improvement compared to SYSBENCH, with an average gain of 40%. **CSD 2000跟友商TLC盘的sysbench读写混合场景的平均延时对比图:** * CSD mixed read performance shows a significant improvement compared to SYSBENCH, with an average gain of 40%. **CSD 2000跟友商TLC盘的sysbench读写混合场景的QPS对比图:** * CSD mixed read performance shows a significant improvement compared to SYSBENCH, with an average gain of 40%. **CSD 2000跟友商TLC盘的sysbench读写混合场景的平均延时对比总结:** * CSD mixed read performance achieves the highest average gain among all comparisons. **CSD 跟普通 SSD区别:** * SSD 多了一层压缩和解压缩功能,当数据在 CSD 内被压缩后,实际 SSD物理空间消耗(NAND)就变少,从而降低 SSD 写放大和降低 GC 的频率和 GC 对业务读写的负面影响等,提升稳态时读写性能。

正文

https://eco.dameng.com/community/post/20220513165845Y2127MA8W2LDNV2NTZ

 

 
 

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

部署数据库

下载

官网下载地址: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/

用户:达梦数据库默认会安装在用户 dmdba 下,如果用户不存在会自动创建(用户组为dinstall);如果用户存在,就会修改这个用户组设置。
安装目录:/opt/dmdbms
相关软件:安装文档里提到的必装软件,这里都安装了,就略过不提。

卸载方法(可选)

初次安装一个数据库,不一定能一次性成功,免不了要反复尝试。再次尝试的时候用官方的卸载方法可以保证卸载干净。

[dmdba@sfx111188 dmdbms]$ ./uninstall.sh -i

复制

开始安装软件

进入安装镜像文件目录,里面有安装文件和文档。非常简单。

[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 RO 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_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是衡量联机事务处理(OLTP,OnlineTransaction Processing)系统的工业标准,是行业中公认的权威和最为复杂的在线事务处理基准测试。它通过模拟仓库和订单管理系统,测试广泛的数据库功能,包括查询、更新和 mini-batch事务(队列式小批量事务)。

TPC-C 的测试方法就是指定业务仓库表的数据量。其他表的数据规模都是基于仓库表按比例扩张,彼此有业务逻辑。测试结果也就一个输出:tpmC ,每分钟创建订单数。配置文件里有各种业务场景的比例,这个通常保持不变。

TPC-C 的优点是有业务场景,比较接近客户交易场景业务。测试执行也简单(变量少)。缺点是理解稍微有点难度。

部署BenchmarkSQL

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

下载&编译安装

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 开发的,连接达梦数据库必须使用达梦8的JDBC驱动。驱动文件在安装目录的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

复制

配置文件指定 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 压缩比会高于这个。

640.png

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

641.png

CSD2000 磁盘压缩比在3.00左右。

643.png

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
    648.png

  • 磁盘: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 空间,压缩比也看起来更高一些。

644.png

性能对比

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

                ![645.png](https://download.dameng.com/eco-file-server/file/eco/preview/20220513173652PIPZ25OYQ67VWDNCMA)

复制

图: CSD2000跟友商TLC 盘的sysbench 只读场景QPS对比
646.png
图:CSD2000跟友商TLC 盘的sysbench 只读场景的平均延时对比

647.png
图:CSD2000跟友商TLC 盘的sysbench 纯写场景的QPS对比

648.png
图:CSD2000跟友商TLC 盘的sysbench 纯写场景的平均延时对比

649.png
图:CSD2000跟友商TLC 盘的sysbench 读写混合场景的QPS对比

650.png
图: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 对业务读写的负面影响等,提升稳态时读写性能。详细原理可以查看下面参考文章。

参考

与[转帖]达梦数据库部署和性能测试实践相似的内容:

[转帖]达梦数据库部署和性能测试实践

https://eco.dameng.com/community/post/20220513165845Y2127MA8W2LDNV2NTZ 本文主要分享国产数据库达梦数据库的部署、BenchmarkSQL 和 sysbench 性能测试以及在可计算存储 CSD 上的性能表现。部署过程比较细节篇幅较

[转帖]达梦数据库 DM8 中 注册服务 说明

2019-10-29 19:3830480原创DM 达梦 本文链接:https://www.cndba.cn/dave/article/3753 达梦数据库 DM8 中 注册服务 说明 在之前的博客我们了解了DM7中的服务注册,如下: DM7 达梦数据库 通过dminit 创建 并 注册 数据库实例

[转帖]DM 达梦数据库 临时表空间 管理说明

2020-12-01 21:3516090原创DM 达梦 本文链接:https://www.cndba.cn/dave/article/4315 在之前的2篇博客中我们了解了达梦数据库表空间的基本操作,如下: DM7 达梦数据库 表空间 管理 说明https://www.cndba.cn/dave/

[转帖]DM8 达梦数据库 查看数据库版本号 方法

2020-09-28 17:24183572原创DM 达梦 本文链接:https://www.cndba.cn/dave/article/4260 在DM7 中,查询数据库版本号的方法和Oracle 一样,通过v$version 视图可以查询。 [dmdba@www.cndba.cn ~]$ dis

[转帖]DM 达梦数据库 记录超长 错误解决方法

2022-08-24 09:423551原创DM 达梦 本文链接:https://www.cndba.cn/dave/article/108596 1 问题说明与分析 在达梦数据库中进行数据库Insert时可能会遇到如下错误: java.sql.SQLException: Record length

[转帖]DM 达梦数据库 忘记 SYSDBA 密码 解决方法

2022-08-04 22:2318321原创DM 达梦 本文链接:https://www.cndba.cn/dave/article/108578 1 背景说明 在其他的关系型数据库中,都有OS认证,所以我们并不担心忘记超级管理员密码的问题。 在达梦数据库中,因为安全的原因,默认并没有启用本地OS

[转帖]龙芯二进制翻译性能的不严谨分析

https://zhuanlan.zhihu.com/p/580008360 先读一下胡老师的大作 节取一些内容如下,下面有官方测试参数: 一通操作猛如虎,一看跑分不如知乎答主: 龙芯UnixBench分高,龙芯说了原因如下: 二进制翻译性如下(LATX就是翻译到X86): 胡老师说spec2000

[转帖]华为欧拉操作系统装机量达 245 万套,跨越生态发展临界点

https://www.ithome.com/0/652/328.htm 好像加上OSV的很多套数了 IT之家 11 月 9 日消息,华为 2022 全联接大会将于 7-9 日举行,涉及华为鸿蒙、华为鲲鹏、昇腾 AI 和欧拉等。 在今日的华为全连接大会上,华为常务董事、ICT 基础设施业务管理委员会

[转帖]远超DDR4,速度可达DDR5 6400!DDR5内存技术、产品解析

https://www.sohu.com/a/326810241_616364 内存是计算机技术的重要组成部分,经历了长时间的竞争更替和路线选择之后,PC内存技术被稳定在以DDR技术为基础的发展路线上。从DDR到DDR2、DDR3,今天主流的内存已进化至DDR4。乐观估计,DDR5将从2019年起降

[转帖]通信圈周盘点:电信业务收入达14504亿元;新华三中国企业网交换机市场份额超三成

http://blog.itpub.net/31545813/viewspace-2930213/ 本周,1~11月电信业务收入累计完成14504亿元;新华三2022前三季度中国企业网交换机市场份额超三成;华为数通跻身2022 Gartner®魔力象限“领导者”;Aruba SD-WAN及云安全产品