本文主要分享国产数据库达梦数据库的部署、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.zipunzip dm8_20210712_x86_rh6_64_ent.zip[dmdba@sfx111188 soft]$ cd dm8_20210712_x86_rh6_64_ent && ls-lrth-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[dmdba@sfx11118 dm8_20210712_x86_rh6_64_ent]$ mount -o loop dm8_20210712_x86_rh6_64_ent_8.1.2.38_pack1.iso disk/dev/loop0 727M 727M 0 100% disk部署规划
内存:主机内存128G,数据库BUFFER POOL 给60G 。数据库还会有些其他内存需求,以及主机后面要跑测试程序也需要一些内存。磁盘:安装目录都放在NVME 接口的SSD盘上,这里选择的是ScaleFlux 的CSD 2000 。路径 data/[root@sfx111188 ~]# lsblk dev/sfdv1n1NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsfdv1n1 252:8192 0 3.5T 0disk data用户:达梦数据库默认会安装在用户 dmdba 下,如果用户不存在会自动创建(用户组为dinstall);如果用户存在,就会修改这个用户组设置。相关软件:安装文档里提到的必装软件,这里都安装了,就略过不提。卸载方法(可选)
初次安装一个数据库,不一定能一次性成功,免不了要反复尝试。再次尝试的时候用官方的卸载方法可以保证卸载干净。[dmdba@sfx111188 dmdbms]$ ./uninstall.sh -iPicked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8Check 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):yWhether to uninstall DM database(/opt/dmdbms/)? (y/Y:Yes n/N:No):yWhether to deletet the dm_svc.conf file? (y/Y:Yes n/N:No):yUninstalling database directorysUninstalling bin directoryUninstall bin directory completedUninstalling bin2 directoryUninstall bin2 directory completedUninstalling include directoryUninstall include directory completedUninstalling desktop directoryUninstall desktop directory completedUninstalling doc directoryUninstall doc directory completedUninstalling drivers directoryUninstall drivers directory completedUninstalling jdk directoryUninstall jdk directory completedUninstalling jar directoryUninstall jar directory completedUninstalling samples directoryUninstall samples directory completedUninstalling script directoryUninstall script directory completedUninstalling tool directoryUninstall tool directory completedUninstalling web directoryUninstall web directory completedUninstalling uninstall directoryUninstall uninstall directory completedUninstalling license_en.txt fileUninstall license_en.txt file completedUninstalling license_zh.txt fileUninstall license_zh.txt file completedUninstalling uninstall.sh fileUninstall uninstall.sh file completedUninstall database directorys completedExecute the command by "root":/opt/dmdbms/root_uninstaller.sh[dmdba@sfx111188 dmdbms]$开始安装软件
进入安装镜像文件目录,里面有安装文件和文档。非常简单。[root@sfx111188 disk]# cd disk[root@sfx111188 disk]# ls -lrth-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安装会有多种模式,这里选择不要 key、自定义安装。安装命令就是 DMInstall.bin -i 即可。[root@sfx111188 disk]# ./DMInstall.bin -i请选择安装语言(C/c:中文 E/e:英文) [C/c]:eExtract install files..........Welcome to DM DBMS InstallerWhether to input the path of Key File? (Y/y:Yes N/n:No) [Y/y]:nPicked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8Whether to Set The TimeZone? (Y/y:Yes N/n:No) [Y/y]:nPlease Input the number of the Installation Type [1 Typical]:4 5.1 Realtime Audit Service 5.3 Instance MonitorService 5.4 Assistant Plug-InServicePlease Input the number of the Installation Type [1 2 3 4 5]:Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8Please Input the install path [/opt/dmdbms]:Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8Please Confirm the install path(/opt/dmdbms)? (Y/y:Yes N/n:No)[Y/y]:yInstallation Location: opt/dmdbmsInstallation Type: CustomConfirm to Install? (Y/y:Yes N/n:No):yFile etc/dm_svc.conf exist, replace it? (Y/y,N/n) [Y/y]:yPicked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8[INFO] Installing DM DBMS...[INFO] Installing BASE Module...[INFO] Installing SERVER Module...[INFO] Installing CLIENT Module...[INFO] Installing DRIVERS Module...[INFO] Installing MANUAL Module...[INFO] Installing SERVICE Module...[INFO] Move log file to log directory.[INFO] Change the power of installtion directory successfully.[INFO] Installed DM DBMS completely.初始化数据库
达梦数据库的可执行文件在安装目录的 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=32file dm.key not found, use default license!License will expire on 2022-07-09 log file path:/data/DAMENG/DAMENG01.log log file path:/data/DAMENG/DAMENG02.logwrite to dir [/data/DAMENG].create dm database success. 2022-03-19 11:04:54
[dmdba@sfx111188 dmdbms]$ tree data/DAMENG/| `--dm_20220319110454_073687.ctl|-- dminit20220319110451.log修改数据库配置文件
达梦数据库配置文件 dm.ini 在数据库初始化目录里。严格来说要将下面参数一一修改。这里用了简单的方法,把要修改的参数放在文件末尾。
[dmdba@sfx111188 dmdbms]$ vim data/DAMENG/dm.ini +$ENABLE_IN_VALUE_LIST_OPT=1ENABLE_SPACELIMIT_CHECK=0MAX_SESSION_STATEMENT=10000NOWAIT_WHEN_UNIQUE_CONFLICT=1WORK_THRD_STACK_SIZE=1024上面参数有个要注意:
启动数据库实例
数据库初始化后,在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[dmdba@sfx111188 dmdbms]$ bin/DmServiceDMSERVER3 startStarting DmServiceDMSERVER3: [ OK ]如果不注册服务,就在 dmdba下手动启动数据库服务也行。
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/SYSDBAServer[LOCALHOST:5236]:mode is normal, state is openlogin used time : 1.072(ms)[-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 successfullyused time: 27.980(ms). Execute id is 310363315.SQL> DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();DMSQL executed successfullyused time: 00:00:02.483. Execute id is 310363316.SQL> DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();DMSQL executed successfullyused 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 12 2 NULL 1 2022-03-21 11:13:35.000000 NULL 2022-03-21 12:00:49.000000 1SQL>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.java117 if(iDB.equals("firebird"))119 else if(iDB.equals("oracle"))121 else if(iDB.equals("postgres"))123 else if(iDB.equals("dameng"))127 log.error("unknown database type '" + iDB + "'");使用ant 编译。
[root@sfx111188 benchmarksql-5.0]# antPicked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8Buildfile: root/benchmarksql-5.0/build.xml [javac] Compiling 11source files to root/benchmarksql-5.0/build [jar] Building jar:/root/benchmarksql-5.0/dist/BenchmarkSQL-5.0.jar修改 run/funcs.sh,增加 dameng 数据库类型的驱动类文件目录。
27 case "$(getProp db)" in 29 cp="../lib/firebird/*:../lib/*" 33 if [ ! -z "${ORACLE_HOME}"-a -d ${ORACLE_HOME}/lib ] ; then 34 cp="${cp}:${ORACLE_HOME}/lib/*" 39 cp="../lib/postgres/*:../lib/*" 42 cp="../lib/dm/*:../lib/*" 45 myCP=".:${cp}:../dist/*"配置达梦数据库连接
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.dmdriver=dm.jdbc.driver.DmDriverconn=jdbc:dm://sfx111188:5236//To run specified transactions per terminal- runMins must equalzero//To run for specified minutes- runTxnsPerTerminal must equal zero//Number of total transactions per minute//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// 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//osCollectorSSHAddr=user@dbhost//osCollectorDevices=net_eth0 blk_sda配置文件指定 TPC-C 仓库数为 10000 仓。
创建用户和表空间
[dmdba@sfx111188 dmdbms]$ disql SYSDBA/SYSDBAServer[LOCALHOST:5236]:mode is normal, state is openlogin used time : 1.286(ms)给表空间文件单独一个目录,方便管理。
[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 内部实际物理大小)。
CREATE USER TPCC IDENTIFIED BY "123456789";ALTER USER TPCC DEFAULT TABLESPACE BENCHMARKSQL;测试用户连接。
[dmdba@sfx111188 dmdbms]$ disql tpcc/123456789Server[LOCALHOST:5236]:mode is normal, state is openlogin used time : 1.183(ms)创建数据库对象
建表语句,大部分表采用分区表,使用 hash 分区,并且指定表的 FILLFACTOR(填充因子)为50。
[root@sfx111188 run]# mkdir sql.damengvim dameng/create_tables.sqlcreate table TPCC.bmsql_config (cfg_name varchar(30) cluster primarykey,create table TPCC.BMSQL_WAREHOUSE (cluster primary key(w_id)PARTITION BY hash(w_id) partitions 100create table TPCC.bmsql_district (cluster primary key(d_w_id, d_id))PARTITION BY hash(d_w_id) partitions 100create table TPCC.bmsql_customer (c_discount decimal(12,2),c_credit_lim decimal(12,2),c_ytd_payment decimal(12,2),cluster primary key(c_w_id,c_d_id, c_id))PARTITION BY hash(c_w_id) partitions 100create table TPCC.bmsql_history (PARTITION BY hash(h_c_w_id) partitions 100create table TPCC.bmsql_oorder (o_all_local decimal(12,2),cluster primary key(o_w_id,o_d_id, o_id)PARTITION BY hash(o_w_id) partitions 100create table TPCC.bmsql_new_order (cluster primary key(no_w_id,no_d_id, no_o_id)PARTITION BY hash(no_w_id) partitions 100create table TPCC.bmsql_order_line (ol_number integer notnull,ol_quantity decimal(12,2),cluster primary key(ol_w_id,ol_d_id, ol_o_id, ol_number)PARTITION BY hash(ol_w_id) partitions 100create table TPCC.bmsql_stock (s_quantity decimal(12,2),cluster primary key(s_w_id,s_i_id)PARTITION BY hash(s_w_id) partitions 100create table TPCC.bmsql_item (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 selectcount(*)+1into n from BMSQL_history; selectmax(hist_id) + 1into n from BMSQL_history; stmt1:='create sequence hist_id_seq start with '||n||' MAXVALUE9223372036854775807 CACHE 50000;';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.dmPicked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8Starting BenchmarkSQL LoadDatadriver=dm.jdbc.driver.DmDriverconn=jdbc:dm://sfx111188:5236fileLocation (not defined)csvNullValue (not defined - using default 'NULL')Worker 001: Loading Warehouse 1Worker 002: Loading Warehouse 2数据大小分析
抽查三个表
SQL> select count(*) from bmsql_warehouse;---------- --------------------used time: 31.668(ms). Execute id is 400.SQL> select count(*) from bmsql_item;---------- --------------------used time: 2.252(ms). Execute id is 401.SQL> select count(*) from bmsql_oorder;---------- --------------------used time: 26.892(ms). Execute id is 402.SQL> select count(*) from bmsql_order_line;---------- --------------------表空间利用率。刚好基本上所有数据文件都接近写满状态。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, WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE') 1024)) FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES 1048576)) TOTAL_SPACE 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/*数据初始化完后,数据文件 CSD 压缩比在3.00左右。这是数据文件接近写满的状态。实际使用中由于数据文件里没有写满,实际 CSD 压缩比会高于这个。BenchmarkSQL 性能测试
测试准备
达梦数据库数据文件读写都是buffer IO,比较依赖PageCache性能。
echo 3 > proc/sys/vm/drop_caches开始测试
[root@sfx111188 run]# sh runBenchmark.sh props.dm21: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.021:24:44,869 [main] INFO jTPCC : Term-00,+-------------------------------------------------------------+21:24:44,870 [main] INFO jTPCC : Term-00, (c) 2003, RaulBarbosa21:24:44,870 [main] INFO jTPCC : Term-00, (c) 2004-2016,Denis Lussier21:24:44,871 [main] INFO jTPCC : Term-00, (c) 2016, JanWieck21: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=dameng21:24:44,871 [main] INFO jTPCC : Term-00, driver=dm.jdbc.driver.DmDriver21:24:44,871 [main] INFO jTPCC : Term-00, conn=jdbc:dm://sfx111188:523621:24:44,871 [main] INFO jTPCC : Term-00, user=tpcc21:24:44,872 [main] INFO jTPCC : Term-00,21:24:44,872 [main] INFO jTPCC : Term-00, warehouses=1000021:24:44,872 [main] INFO jTPCC : Term-00, terminals=6421:24:44,873 [main] INFO jTPCC : Term-00, runMins=1021:24:44,873 [main] INFO jTPCC : Term-00, limitTxnsPerMin=021:24:44,873 [main] INFO jTPCC : Term-00, terminalWarehouseFixed=true21:24:44,873 [main] INFO jTPCC : Term-00,21:24:44,873 [main] INFO jTPCC : Term-00, newOrderWeight=4521:24:44,873 [main] INFO jTPCC : Term-00, paymentWeight=4321:24:44,873 [main] INFO jTPCC : Term-00, orderStatusWeight=421:24:44,873 [main] INFO jTPCC : Term-00, deliveryWeight=421:24:44,873 [main] INFO jTPCC : Term-00, stockLevelWeight=421:24:44,873 [main] INFO jTPCC : Term-00,21:24:44,873 [main] INFO jTPCC : Term-00, resultDirectory=null21:24:44,873 [main] INFO jTPCC : Term-00, osCollectorScript=null21: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.0121:34:45,262 [Thread-13] INFO jTPCC : Term-00, Session Start = 2022-03-19 21:24:4521:34:45,262 [Thread-13] INFO jTPCC : Term-00, Session End = 2022-03-19 21:34:4521: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/binexport PATH=$PATH:$DM_HOME/bin编译配置里加上达梦数据库支持 。
./configure --without-mysql --with-dm===============================================================================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 -pthreadCPPFLAGS :-D_GNU_SOURCE -I$(top_srcdir)/src-I$(abs_top_builddir)/third_party/luajit/inc-I$(abs_top_builddir)/third_party/concurrency_kit/includeLDFLAGS :-L/usr/local/liblibexecdir :${prefix}/libexecmandir : ${prefix}/share/manLUAJIT_CFLAGS : -I$(abs_top_builddir)/third_party/luajit/incLUAJIT_LIBS :$(abs_top_builddir)/third_party/luajit/lib/libluajit-5.1.a -ldlLUAJIT_LDFLAGS :-rdynamicConcurrency Kit : bundledCK_CFLAGS :-I$(abs_top_builddir)/third_party/concurrency_kit/includeCK_LIBS :$(abs_top_builddir)/third_party/concurrency_kit/lib/libck.a===============================================================================[root@sfx111188 sysbench-master]# which 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 testsoltp_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 -B2Compiled-in database drivers: --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;CREATE USER TUSER IDENTIFIED BY "123456789";ALTER USER TUSER DEFAULT TABLESPACE SYSBENCHDB;初始化sysbench 数据
200行 建表指定 storage(fillfactor 50) ,调整索引创建语句,增加 storage 语句,设置 FILLFACTOR 为75,以及指定独立的索引表空间。同时把索引创建语句移到建表语句之后插入数据之前。否则后面并行创建索引语句会把临时表空间文件撑大。
ifsysbench.opt.auto_inc then id_def ="INTEGER IDENTITY(1,1)" id_def ="INTEGER NOT NULL" engine_def=" STORAGE( FILLFACTOR 50 ) " error("Unsupported databasedriver:" .. drv:name()) print(string.format("Creating table 'sbtest%d'...",table_num)) k INTEGER DEFAULT '0' NOTNULL, c CHAR(120) DEFAULT '' NOTNULL, pad CHAR(60) DEFAULT '' NOTNULL, table_num, id_def,id_index_def, engine_def, sysbench.opt.create_table_options) if sysbench.opt.create_secondary then print(string.format("Creating a secondary index on'sbtest%d'...", con:query(string.format("CREATE INDEX k_%d ON sbtest%d(k) storage (FILLFACTOR 75, ON INDEXTS) ", if(sysbench.opt.table_size > 0) then
print(string.format("Inserting %d records into 'sbtest%d'", sysbench.opt.table_size, table_num))初始化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/123456789Server[LOCALHOST:5236]:modeis normal, state is openlogin used time : 3.038(ms)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---------- ---------- -------------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.运行测试
echo 3 > /proc/sys/vm/drop_caches§ 主要测试脚本: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=UTF8370 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.0373 21:34:53,649 [main] INFO jTPCC : Term-00,+-------------------------------------------------------------+374 21:34:53,649 [main] INFO jTPCC : Term-00, (c) 2003, Raul Barbosa375 21:34:53,649 [main] INFO jTPCC : Term-00, (c) 2004-2016, Denis Lussier376 21:34:53,651 [main] INFO jTPCC : Term-00, (c) 2016, Jan Wieck377 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=dameng380 21:34:53,651 [main] INFO jTPCC : Term-00,driver=dm.jdbc.driver.DmDriver381 21:34:53,651 [main] INFO jTPCC : Term-00,conn=jdbc:dm://sfx111188:5236382 21:34:53,651 [main] INFO jTPCC : Term-00, user=tpcc383 21:34:53,651 [main] INFO jTPCC : Term-00,384 21:34:53,651 [main] INFO jTPCC : Term-00, warehouses=10000385 21:34:53,651 [main] INFO jTPCC : Term-00, terminals=128386 21:34:53,652 [main] INFO jTPCC : Term-00, runMins=10387 21:34:53,652 [main] INFO jTPCC : Term-00, limitTxnsPerMin=0388 21:34:53,652 [main] INFO jTPCC : Term-00, terminalWarehouseFixed=true389 21:34:53,653 [main] INFO jTPCC : Term-00,390 21:34:53,653 [main] INFO jTPCC : Term-00, newOrderWeight=45391 21:34:53,653 [main] INFO jTPCC : Term-00, paymentWeight=43392 21:34:53,653 [main] INFO jTPCC : Term-00, orderStatusWeight=4393 21:34:53,653 [main] INFO jTPCC : Term-00, deliveryWeight=4394 21:34:53,653 [main] INFO jTPCC : Term-00, stockLevelWeight=4395 21:34:53,653 [main] INFO jTPCC : Term-00,396 21:34:53,653 [main] INFO jTPCC : Term-00, resultDirectory=null397 21:34:53,653 [main] INFO jTPCC : Term-00, osCollectorScript=null398 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: 197400 21:34:53,809 [main] INFO jTPCC : Term-00, C value for C_LAST thisrun: 98401 21:34:53,810 [main] INFO jTPCC : Term-00,402 21:41:19,515 [Thread-76] ERROR jTPCCTData : Too many mvcc conflict403 dm.jdbc.driver.DMException: Too many mvcc conflict404 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 参数值。
数据库厂商之间的性能测试对比,常用技巧就是尽可能降低 IO 对数据库性能的影响。如小数据集大内存、Redo/Binlog 日志异步落盘。这个能一定程度反映不同数据库之间的能力差异。本次性能测试主要是比较在相同的数据库(达梦8),相同的数据集下,相同的测试场景下,不同的 SSD 性能差异,负载特点是 IO BOUND。数据集大小远大于数据库内存大小,Redo 日志强制落盘等。这个比较符合生产环境的特点。达梦数据库同样的数据集在普通标盘 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 对业务读写的负面影响等,提升稳态时读写性能。详细原理可以查看下面参考文章。