測試模型
TPC-C測試用到的模型是一個大型的商品批發銷售公司,它擁有若干個分布在不同區域的商品倉庫。當業務擴展的時候,公司將添加新的倉庫。每個倉庫負責為10個銷售點供貨,其中每個銷售點為3000個客戶提供服務,每個客戶提交的訂單中,平均每個訂單有10項產品,所有訂單中約1%的產品在其直接所屬的倉庫中沒有存貨,必須由其他區域的倉庫來供貨。同時,每個倉庫都要維護公司銷售的100000種商品的庫存記錄。
測試指標
TPC-C測試的結果主要有兩個指標,即流量指標(Throughput,簡稱tpmC)和性價比(Price/Performance,簡稱Price/tpmC)。
流量指標(Throughput,簡稱tpmC):按照TPC組織的定義,流量指標描述了系統在執行支付操作、訂單狀態查詢、發貨和庫存狀態查詢這4種交易的同時,每分鍾可以處理多少個新訂單交易。所有交易的響應時間必須滿足TPC-C測試規范的要求,且各種交易數量所占的比例也應該滿足TPC-C測試規范的要求。在這種情況下,流量指標值越大說明系統的聯機事務處理能力越高。
性價比(Price/Performance,簡稱Price/tpmc):即測試系統的整體價格與流量指標的比值,在獲得相同的tpmC值的情況下,價格越低越好。
環境准備
|
詳細信息
|
數據版本
|
dm8
|
jdk版本
|
jdk1.8.0_242
|
apache-ant版本
|
1.10.10
|
benchmarkSQL版本
|
benchmarksql-5.0
|
cpu
|
32核 x86
|
內存
|
64G
|
操作系統
|
centos7.8
|
實例掛載磁盤大小
|
500G
|
初始化數據庫
./dminit path=/dmdata page_size=32
上傳安裝包到/tpcc下


1 安裝jdk並配置環境變量
解壓jdk
tar -zxvf jdk-8u271-linux-x64.tar.gz
編輯/etc/profile文件,在文件末尾添加一下內容
export JAVA_HOME=/tpcc/jdk1.8.0_271
export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin
執行命令source /etc/profile 生效
執行命令java -version或jps環境變量是否生效


2 apache-ant 安裝和配置環境變量
官網下載apache-ant
https://ant.apache.org/bindownload.cgi
解壓apache-ant
unzip apache-ant-1.10.10-bin.zip
vim ~/.bash_profile
export APACH_HOME=/tpcc/apache-ant-1.10.10
export PATH=$PATH:$APACH_HOME/bin
執行命令source ~/.bash_profile生效
執行命令ant -version 查看是否生效


3 benchmarksql安裝和配置
官網下載BenchmarkSQL
https://sourceforge.net/projects/benchmarksql/
解壓安裝包
unzip benchmarksql-5.0\(2\).zip
官方版本默認不支持達夢數據庫,需要修改源碼
vim /tpcc/benchmarksql-5.0/src/client/jTPCC.java 添加如下內容


vim /tpcc/benchmarksql-5.0/run/funcs.sh 修改如下


在benchmarksql的lib庫中添加dameng目錄,放置driver包
cp /dm8/drivers/jdbc/DmJdbcDriver18.jar /tpcc/benchmarksql-5.0/lib/dameng
在benchmarksql-5.0 目錄使用ant命令編譯源碼


在benchmarksql的run目錄編輯props.dm
db=dameng
driver=dm.jdbc.driver.DmDriver
conn=jdbc:
dm://192.168.10.74:5236
user=BENCHMARKSQL
password=123456789
warehouses=100
terminals=144
//To run specified transactions per terminal- runMins must equal zero
runTxnsPerTerminal=0
//To run for specified minutes- runTxnsPerTerminal must equal zero
runMins=5
//Number of total transactions per minute
limitTxnsPerMin=0
//The following five values must add up to 100
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4
創建測試用戶及授權
CREATE TABLESPACE BENCHMARKSQL1 DATAFILE 'BENCHMARKSQL1.dbf' SIZE 10000;
CREATE USER "BENCHMARKSQL" IDENTIFIED BY "123456789" 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 float,
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 float,
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)
);
裝載數據
運行以下命令裝載 100 個倉庫數據
./runLoader.sh props.dm numWarehouses 100


創建索引和序列
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 benchmarksql.bmsql_history;
if(n != 1) then
select max(hist_id) + 1 into n from benchmarksql.bmsql_history;
end if;
PRINT n;
stmt1:='create sequence benchmarksql.bmsql_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.bmsql_hist_id_seq.nextval);
修改dm.ini動態參數(sql腳本)
修改靜態參數
CKPT_FLUSH_PAGES = 0
FAST_RW_LOCK=2
ENABLE_MONITOR = 0
FIRST_ROWS=16
重啟數據庫服務
systemctl restart DmServiceDM.service
數據預加載
擴庫以及日志文件、優化表
alter tablespace "ROLL" resize datafile 'ROLL.DBF' to 10000;
alter database resize logfile 'DAMENG01.log' to 50000;
alter database resize logfile 'DAMENG02.log' to 50000;
--測試前執行如下SQL:
--item表,8K的頁,需要占用1300頁
SP_SET_TAB_FAST_POOL_FLAG('BENCHMARKSQL', 'BMSQL_ITEM', 1);
SP_SET_TAB_FAST_POOL_FLAG('BENCHMARKSQL', 'BMSQL_WAREHOUSE', 1);
SP_SET_TAB_FAST_POOL_FLAG('BENCHMARKSQL', 'BMSQL_DISTRICT', 1);
如果是壓力測試(數據都可以在內存放下),可以執行下面的語句,把數據預加載到內存:
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";
執行測試
./runBenchmark.sh props.dm


測試后清除數據
./runDatabaseDestroy.sh props.dm
