注册
DSC集群上进行TPCC测试
培训园地/ 文章详情 /

DSC集群上进行TPCC测试

lccccc 2025/09/18 92 0 0

DSC集群上进行TPCC测试

一、测试工具BenchmarkSQL介绍

BenchmarkSQL 是一款开源的数据库性能基准测试工具,专注于OLTP(联机事务处理)场景的 TPC-C 标准测试,用于评估数据库在高并发事务处理中的性能、吞吐量(tpmC)、响应时间和扩展性。
TPC基准TMC(TPC-C)是一个OLTP的工作基准。它是只读和更新频繁的事务的混合,它模拟复杂OLTP应用环境中的活动。它是通过模拟与这种环境联系的大量特性实现的,这些特性包括为:

  • 不同复杂程度的多种事务类型的同时执行
  • 在线和延迟的事务执行模式
  • 多个在线终端会话
  • 中等系统和应用程序的执行时间
  • 大量磁盘输入/输出
  • 事务完整性(ACID属性)
  • 通过主关键字和次关键字来访问非均匀分布的数据
  • 由具有多种大小、属性和关联的多个表组成的数据库
  • 数据访问和更新竞争
    TPC-C报告的性能度量是一个“商业吞吐量”,它测量每分钟处理的订单数。多种事务被用于模拟处理订单的商业活动,且每个事务受反应时间约束的支配。本基准的性能度量用每分钟事务数-C(tpmC)表示。

二、测试工具BenchmarkSQL适用场景

1)高并发事务处理系统(OLTP)
模拟真实业务中的短事务、高频读写操作,如订单创建、支付处理、库存更新等,要求系统具备高吞吐量(tpmC)和低延迟响应能力。
2)数据库事务一致性验证
测试数据库在并发压力下的事务隔离性、原子性和数据一致性,涉及强事务保证的场景(如金融扣款、库存扣减)。
3)系统容量规划与稳定性压测
通过调节仓库数 (warehouses) 和并发线程数 (terminals),模拟不同数据规模与用户压力(支持长时间运行如 runMins),评估系统极限容量与高负载下的稳定性。

三、BenchmarkSQL参数介绍

3.1 并发与数据规模参数

warehouses:指定初始仓库数量,每个仓库约占用 100MB 存储,代表一个独立业务单元;仓库数影响数据总量(如 100 仓库≈10GB),并决定测试上限(建议不低于 5000 仓库以模拟生产负载)。
terminals:设置并发线程数(模拟用户终端数),每个终端绑定固定仓库以减少锁竞争;建议值不超过 warehouses * 10(如 100 仓库时并发数≤1000)以避免性能下降。
terminalWarehouseFixed:控制终端与仓库绑定模式:true(默认)确保每个终端独占一个仓库(兼容 TPC-C 规范);false 允许终端随机访问所有仓库。

3.2 测试时长与事务控制参数

runMins:定义压测持续时间(单位:分钟),建议 ≥10 分钟以评估稳定性;生产环境推荐 ≥1 小时(若启用此参数,需设 runTxnsPerTerminal=0)。
loadWorkers:初始化数据生成的并行进程数,默认 4;增大可加速数据加载但需匹配 CPU 核心数。
runTxnsPerTerminal:指定每个终端执行的事务总数(如 runTxnsPerTerminal=10 表示每个终端处理 10 个事务),用于固定事务量测试(需设 runMins=0)

3.3 数据库连接与驱动参数

db、driver、conn
指定数据库类型(如 db=dameng)、
JDBC 驱动类(如 driver=dm.jdbc.driver.DmDriver)
连接 URL(如 conn=jdbc:dm://ip:port)
user、password
数据库认证凭据,需匹配目标实例权限。

3.4 事务比例与权重参数

以下参数总和必须为 100,默认比例符合 TPC-C 标准:
newOrderWeight=45:新订单事务权重(核心计分项,占 43%-45%)
paymentWeight=43:支付事务权重(高频读写操作)
orderStatusWeight=4:订单状态查询权重(只读低频)
deliveryWeight=4:发货事务权重(批量处理)
stockLevelWeight=4:库存查询权重(只读低频)

四、测试前期准备

4.1 测试环境搭建

本次测试是基于DMDSC集群测试的,需提前准备两台虚拟机,相关DSC配置搭建操作可浏览往期博客来进行搭建:
https://10.9.25.21/community/training/d46abd32047117c255427300914fa118

4.2 安装测试工具

获取Benchmarksql工具的安装包,并在主机器上面解压安装

4.3 初步配置测试工具

首先我们切换到安装工具下的run目录,我们需要对目录下的prom.dm文件进行初步配置,配置如下:
db=dameng # 数据库类型:达梦数据库
driver=dm.jdbc.driver.DmDriver # JDBC驱动类
conn=jdbc:dm://IP地址:端口号 # 数据库连接地址
user=BENCHMARKSQL # 数据库用户名
password=密码 # 数据库密码
warehouses=100 # 仓库数量
loadWorkers=10 # 数据加载线程数
terminals=100 # 终端数(并发用户数)
runTxnsPerTerminal=0 # 每个终端运行的事务数(0表示不限制)
runMins=10 # 运行时间(分钟),此处配置为10分钟
limitTxnsPerMin=0 # 每分钟最大事务数(0表示不限制)
terminalWarehouseFixed=true # 终端是否固定对应仓库(true为4.x兼容模式)
newOrderWeight=45 # 新订单事务权重
paymentWeight=43 # 支付事务权重
orderStatusWeight=4 # 订单状态查询事务权重
deliveryWeight=4 # 发货事务权重
stockLevelWeight=4 # 库存水平查询事务权重
resultDirectory=dameng_result_%tY-%tm-%td_%tH%tM%tS # 结果目录(含时间戳)
osCollectorScript=./misc/os_collector_linux.py # 系统信息收集脚本
osCollectorInterval=1 # 系统信息收集间隔(秒)

4.4 提前装载测试用到的数据

首先启动集群的数据库(配置好的DSC集群的数据库数据是共享的,所以只需要在一台虚拟机上配置即可),然后执行下方命令创建测试所需要的用户、表空间和表:
DROP USER "BENCHMARKSQL" CASCADE;
DROP TABLESPACE BENCHMARKSQL1;

CREATE TABLESPACE BENCHMARKSQL1 DATAFILE 'BENCHMARKSQL1.dbf' SIZE 20000;

CREATE USER "BENCHMARKSQL" IDENTIFIED BY "密码" DEFAULT TABLESPACE "BENCHMARKSQL1";
GRANT DBA TO BENCHMARKSQL;

create table BENCHMARKSQL.bmsql_config (
cfg_name varchar(30) cluster primary key,
cfg_value varchar(50)
);

create table BENCHMARKSQL.bmsql_warehouse (
w_id integer not null,
w_ytd decimal(22,2),
w_tax float,
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)
)STORAGE(FILLFACTOR 1);

create table BENCHMARKSQL.bmsql_district (
d_w_id integer not null,
d_id integer not null,
d_ytd decimal(22,2),
d_tax float,
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)
)STORAGE(FILLFACTOR 1);

create table BENCHMARKSQL.bmsql_customer (
c_w_id integer not null,
c_d_id integer not null,
c_id integer not null,
c_discount float,
c_credit char(2),
c_last varchar(16),
c_first varchar(16),
c_credit_lim float,
c_balance float,
c_ytd_payment float,
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)
);

create table BENCHMARKSQL.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 float,
h_data varchar(24)
)storage(branch(32,32),without counter);

create table BENCHMARKSQL.bmsql_oorder (
o_w_id integer not null,
o_d_id integer not null,
o_id integer not null,
o_c_id integer,
o_carrier_id integer,
o_ol_cnt float,
o_all_local float,
o_entry_d timestamp,
cluster primary key(o_w_id, o_d_id, o_id)
)storage(without counter);

create table BENCHMARKSQL.bmsql_new_order (
no_w_id integer not null,
no_d_id integer not null,
no_o_id integer not null,
cluster primary key(no_w_id, no_d_id, no_o_id)
)storage(without counter);

create table BENCHMARKSQL.bmsql_order_line (
ol_w_id integer not null,
ol_d_id integer not null,
ol_o_id integer not null,
ol_number integer not null,
ol_i_id integer not null,
ol_delivery_d timestamp,
ol_amount float,
ol_supply_w_id integer,
ol_quantity float,
ol_dist_info char(24),
cluster primary key(ol_w_id, ol_d_id, ol_o_id, ol_number)
)storage(without counter);

create table BENCHMARKSQL.bmsql_stock (
s_w_id integer not null,
s_i_id integer not null,
s_quantity float,
s_ytd float,
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)
);

create table BENCHMARKSQL.bmsql_item (
i_id integer not null,
i_name varchar(24),
i_price float,
i_data varchar(50),
i_im_id integer,
cluster primary key(i_id)
);

接下来我们切回run目录,执行下面语句进行数据装载
chmod +x runLoader.sh #添加执行权限
./runLoader.sh props.dm

装载完数据后我们再重新连接数据库,并为数据库创建索引
create index ndx_customer_name on BENCHMARKSQL.BMSQL_customer (c_w_id, c_d_id, c_last, c_first);
create or replace procedure BENCHMARKSQL.createsequence
as
n int;
stmt1 varchar(200);
begin
select count(*)+1 into n from BMSQL_history;
if(n != 1) then
select max(hist_id) + 1 into n from BMSQL_history;
end if;
PRINT n;
stmt1:='create sequence hist_id_seq start with '||n||' MAXVALUE 9223372036854775807 CACHE 50000;';
EXECUTE IMMEDIATE stmt1;
end;
/
call BENCHMARKSQL.createsequence;
alter table BENCHMARKSQL.BMSQL_history modify hist_id integer default (BENCHMARKSQL.hist_id_seq.nextval);

4.5 配置参数

对数据库的参数进行修改方便后续的测试
SP_SET_PARA_VALUE(2,'WORKER_THREADS',64);
SP_SET_PARA_VALUE(2,'IO_THR_GROUPS',16);
SP_SET_PARA_VALUE(2,'GEN_SQL_MEM_RECLAIM',0);
SP_SET_PARA_VALUE(2,'MAX_OS_MEMORY', 100);
SP_SET_PARA_VALUE(2,'MEMORY_POOL', 2000);
SP_SET_PARA_VALUE(2,'MEMORY_N_POOLS', 59);
SP_SET_PARA_VALUE(2,'MEMORY_TARGET', 102000);
SP_SET_PARA_VALUE(2,'BUFFER', 406000);
SP_SET_PARA_VALUE(2,'BUFFER_POOLS', 101);
SP_SET_PARA_VALUE(2,'RECYCLE', 41000);
SP_SET_PARA_VALUE(2,'RECYCLE_POOLS', 97);
SP_SET_PARA_VALUE(2,'FAST_POOL_PAGES', 10000);
SP_SET_PARA_VALUE(2,'FAST_ROLL_PAGES', 3000);
SP_SET_PARA_VALUE(2,'TASK_THREADS', 16);
SP_SET_PARA_VALUE(2,'DSC_INSERT_LOCK_ROWS', 0);
SP_SET_PARA_VALUE(2,'MEMORY_MAGIC_CHECK', 1);
SP_SET_PARA_VALUE(1,'HJ_BUF_GLOBAL_SIZE', 102000);
SP_SET_PARA_VALUE(1,'HJ_BUF_SIZE', 512);
SP_SET_PARA_VALUE(1,'HAGR_BUF_GLOBAL_SIZE',64000);
SP_SET_PARA_VALUE(1,'HAGR_BUF_SIZE', 512);
SP_SET_PARA_VALUE(2,'SORT_FLAG',1);
SP_SET_PARA_VALUE(2,'SORT_BLK_SIZE',2);
SP_SET_PARA_VALUE(2,'SORT_BUF_SIZE', 50);
SP_SET_PARA_VALUE(2,'SORT_BUF_GLOBAL_SIZE', 102000);
SP_SET_PARA_VALUE(2,'RLOG_POOL_SIZE', 2048);
SP_SET_PARA_VALUE(2,'CACHE_POOL_SIZE', 2048);
SP_SET_PARA_VALUE(2,'DICT_BUF_SIZE', 1024);
SP_SET_PARA_VALUE(2,'VM_POOL_TARGET', 8192);
SP_SET_PARA_VALUE(2,'SESS_POOL_TARGET', 8192);
SP_SET_PARA_VALUE(2,'USE_PLN_POOL', 1);
SP_SET_PARA_VALUE(2,'ENABLE_MONITOR', 1);
SP_SET_PARA_VALUE(2,'SVR_LOG', 0);
SP_SET_PARA_VALUE(2,'TEMP_SIZE', 1024);
SP_SET_PARA_VALUE(2,'TEMP_SPACE_LIMIT', 102400);
SP_SET_PARA_VALUE(2,'MAX_SESSIONS', 12600);
SP_SET_PARA_VALUE(2,'MAX_SESSION_STATEMENT', 20000);
SP_SET_PARA_VALUE(2,'PK_WITH_CLUSTER', 1);
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',0);
SP_SET_PARA_VALUE(2,'OLAP_FLAG',2);
SP_SET_PARA_VALUE(2,'VIEW_PULLUP_FLAG',1);
SP_SET_PARA_VALUE(2,'OPTIMIZER_MODE',1);
SP_SET_PARA_VALUE(2,'ADAPTIVE_NPLN_FLAG',0);
SP_SET_PARA_VALUE(2,'MONITOR_INDEX_FLAG',2);
SP_SET_PARA_VALUE(2,'ENABLE_CREATE_BM_INDEX_FLAG',0);
SP_SET_PARA_VALUE(2,'PARALLEL_PURGE_FLAG',1);
SP_SET_PARA_VALUE(2,'PARALLEL_POLICY',2);
SP_SET_PARA_DOUBLE_VALUE(2,'UNDO_RETENTION',900);
SP_SET_PARA_VALUE(2,'UNDO_EXTENT_NUM',16);
SP_SET_PARA_VALUE(2,'ENABLE_INJECT_HINT',1);
SP_SET_PARA_VALUE(2,'BTR_SPLIT_MODE',1);
SP_SET_PARA_VALUE(2,'FAST_LOGIN',1);
SP_SET_PARA_VALUE(2,'ENABLE_MONITOR_BP',0);
SP_SET_PARA_VALUE(2,'ENABLE_FREQROOTS',0);
SP_SET_PARA_VALUE(2,'MULTI_PAGE_GET_NUM',16);
SP_SET_PARA_VALUE(2,'PRELOAD_SCAN_NUM',4);
SP_SET_PARA_VALUE(2,'PRELOAD_EXTENT_NUM',5);
SP_SET_PARA_VALUE(2,'DSC_N_POOLS',59);
SP_SET_PARA_VALUE(2,'DSC_HALT_SYNC',0);
SP_SET_PARA_VALUE(2,'DSC_N_CTLS',50000);
SP_SET_PARA_VALUE(2,'DSC_ENABLE_MONITOR',0);
SP_SET_PARA_VALUE(2,'TRX_DICT_LOCK_NUM',5);
SP_SET_PARA_VALUE(2,'DIRECT_IO',1);

五、开始测试

本次测试计划分为3种不同环境下进行TPCC测试,只连主库、负载均衡、停掉一台

5.1 数据预装载

在 TPCC 测试里,若不提前预装载数据,测试中执行事务时,会额外掺杂 “生成基础数据” 的操作,这些操作会直接打乱对数据库 “真实业务性能” 的判断,所以操作前我们先执行下方语句将数据预装载:
select count() from "BENCHMARKSQL"."BMSQL_CUSTOMER" union all
select count(
) from "BENCHMARKSQL"."BMSQL_DISTRICT" union all
select count() from "BENCHMARKSQL"."BMSQL_ITEM" union all
select count(
) from "BENCHMARKSQL"."BMSQL_NEW_ORDER" union all
select count() from "BENCHMARKSQL"."BMSQL_OORDER" union all
select count(
) from "BENCHMARKSQL"."BMSQL_ORDER_LINE" union all
select count() from "BENCHMARKSQL"."BMSQL_STOCK" union all
select count(
) from "BENCHMARKSQL"."BMSQL_WAREHOUSE" union all
select count(*) from "BENCHMARKSQL"."BMSQL_HISTORY" union all
select count("C_PAYMENT_CNT") from "BENCHMARKSQL"."BMSQL_CUSTOMER";

5.2 只连主库测试

测试前需要将prom.dm文件配置里的数据库连接地址配置为主库的ip地址与其对应的端口号,然后执行测试语句:
chmod +x runBenchmark.sh
./runBenchmark.sh props.dm

5.3 负载均衡

测试前需要将prom.dm文件配置里的数据库连接地址配置为运行中设备的ip地址与其对应的端口号,停掉一台DSC,然后执行测试语句:
chmod +x runBenchmark.sh
./runBenchmark.sh props.dm

5.4 停掉一台DSC

首先需要在/etc目录下配置dm_svc.conf,在这里面配置服务名,DSC集群模板如下:
TIME_ZONE=(480)
LANGUAGE=(cn)
DSC=(业务ip1:5236,业务ip2:5236)##数据库业务网
[DSC]
CLUSTER=(DSC)
SWITCH_TIMES=(99)
SWITCH_INTERVAL=(200)
#如果有关键字需求,增加参数KEYWORDS=()

测试前需要将prom.dm文件配置里的数据库连接地址配置为运行中设备的ip地址与其对应的端口号,停掉一台DSC,然后执行测试语句:
chmod +x runBenchmark.sh
./runBenchmark.sh props.dm

5.5 注意事项

需要注意,在两次测试之间执行下述指令:
checkpoint(100);

TPCC 测试中两次测试间的 checkpoint,本质是通过强制数据一致性刷新,消除历史测试的残留影响,标准化测试初始条件,最终确保测试结果的准确性、独立性和可比性,更真实地反映数据库在事务处理场景下的性能表现。

5.6 清除数据

在完成测试后,我们可以执行命令清除测试用到的数据来释放空间
chmod +x runDatabaseDestroy.sh
./runDatabaseDestroy.sh props.dm

5.7 结果总结

停掉一台 DSC 节点(性能最优)
单节点运行时,可独占所有硬件资源(CPU、内存、存储 I/O 等),彻底消除原集群中主备节点的资源竞争(如存储 I/O 争抢、CPU 调度冲突)。同时,省去了集群模式下的分布式协调、跨节点日志同步、心跳检测等额外开销。若测试负载未达单节点硬件上限,事务处理效率反而因资源独占和简化的运行机制而提升,TPMC 表现最佳。

只连主库(性能次之)
直接连接主库避免了负载均衡的转发延迟,但主库仍需与备库共享底层资源(如共享存储的 I/O 带宽)。备库后台执行的日志同步、数据校验等操作会占用部分资源,与主库形成隐性竞争(如写 Redo 日志时的 I/O 阻塞)。此外,集群默认配置可能保留了分布式协同相关的机制,虽未直接转发请求,但仍有少量集群维护开销,导致其性能略低于单节点场景。

负载均衡(性能最差)
负载均衡需通过中间层转发请求,引入路由解析、事务类型判断等延迟;主备同步延迟可能导致备库读请求需频繁向主库确认最新数据,产生额外网络交互。若读写比例失衡(写事务占比高),分流优势无法体现,却要承担转发开销;加上主备节点的资源竞争(如共享存储 I/O 冲突),整体额外开销超过分流带来的收益,TPMC 表现最差。

六、总结

针对达梦数据库的 TPCC 测试,是基于 TPC 组织制定的 OLTP 场景标准化测试体系,核心是模拟零售行业核心业务流程(含新订单、支付、订单查询等 5 类事务,以 “新订单” 事务为基准),来衡量达梦数据库在高并发读写场景下的性能与稳定性。测试核心指标为 TPMC(每分钟 “新订单” 事务数,直接体现性能上限),同时监控事务响应时间、成功率及 CPU / 内存 / 存储 I/O 等资源利用率。其用途包括:验证达梦数据库是否满足业务性能需求(如峰值 TPMC 指标),对比不同硬件(如 SSD/HDD)、达梦参数(如缓存策略、锁配置)的优化效果,为达梦数据库的技术选型提供依据,以及通过长时间高负载测试(如稳定运行 4 小时),排查达梦数据库是否存在崩溃、数据不一致等稳定性问题。

在 DMDSC 集群 TPCC 测试中,三种场景性能排序为:停掉一台 DSC 节点(最优)> 只连主库(次之)> 负载均衡(最差)。停掉一台 DSC 节点时,剩余单节点可独占 CPU、内存、存储 I/O 等所有硬件资源,消除原集群主备节点的资源竞争,还省去分布式协调、跨节点日志同步等集群额外开销,若测试负载未达单节点硬件上限,事务处理效率提升,TPMC 最佳;只连主库虽避免负载均衡转发延迟,但主库与备库共享底层资源,备库后台操作会占用资源并与主库形成隐性竞争,且集群默认保留的分布式协同机制带来少量维护开销,性能略逊于单节点;负载均衡因中间层转发引入延迟,主备同步延迟可能引发额外网络交互,若读写比例失衡则分流优势难显,还需承担转发开销,叠加主备节点资源竞争,整体额外开销超过收益,TPMC 最差。

达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台:
https://eco.dameng.com

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服