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

第六章:测试 OceanBase 数据库 6.4 如何运行 TPC-C 测试

619

6.4 如何运行 TPC-C 测试

TPC(Transaction Processing Performance Council,事务处理性能委员会)是由数十家会员公司创建的非盈利组织,总部设在美国。TPC 的成员主要是计算机软硬件厂家,而非计算机用户,其功能是制定商务应用基准程序的标准规范、性能和价格度量,并管理测试结果的发布。

TPC-C 是 TPC 推出的一系列性能测试标准中的一款,自 1992 年推出,便成为了数据库性能测试的标杆,各个数据库大厂都向 TPC 委员会提交了测试结果,以期望在 TPC-C 测试的排行榜上能拥有一席之地。

2019 年之前,TPC-C 榜首一直是 Oracle 公司,持续 8 年多。2019 年 9 月底,OceanBase 以分布式数据库身份参与 TPC-C 评测,夺得榜首。2020 年 5 月,OceanBase 再次参与 TPC-C 评测,刷新了之前的成绩(提升了 10 倍)。

OceanBase 第一次参加 TPC-C 使用的是云服务器,规模 204 台。第二次也是云服务器,规模 1500 台左右。这是由于 TPC-C 的标准定义非常严格,对数据量、业务读写行为要求都很具体,导致机器规模数很大,普通的企业测试不能采用这个标准。业界参照 TPC-C 的业务模型和标准有类似的测试程序开源,如 BenchmarkSQL。


TPC-C 简介

数据库模型

在测试开始前,TPC-C Benchmark 规定了数据库的初始状态(也就是数据库中数据生成的规则),其中 ITEM 表中固定包含 10 万种商品,仓库的数量可进行调整,假设 WAREHOUSE 表中有 W 条记录,那么:

  • STOCK 表中应有 W×10 万条记录(每个仓库对应 10 万种商品的库存数据);

  • DISTRICT 表中应有 W×10 条记录(每个仓库为 10 个地区提供服务);

  • CUSTOMER 表中应有 W×10×3000 条记录(每个地区有 3000 个客户);

  • HISTORY 表中应有 W×10×3000 条记录(每个客户一条交易历史);

  • ORDER 表中应有 W×10×3000 条记录(每个地区 3000 个订单),并且最后生成的 900 个订单将被添加到 NEW-ORDER 表中,每个订单随机生成 5~15 条 ORDER-LINE 记录。

在测试过程中,每一个地区(DISTRICT)都有一个对应的终端(Terminal),模拟为用户提供服务。在每个终端的生命周期内,要循环往复地执行各类事务,当终端执行完一个事务的周期后,就进入下一个事务的周期。

客户下单后,包含若干个订单明细(ORDER-LINE)的订单(ORDER)被生成,并被加入新订单(NEW-ORDER)列表。

客户支付订单会产生交易历史(HISTORY)。 每个订单(ORDER)平均包含 10 条订单项(ORDER-LINE),其中 1% 需要从远程仓库中获取,这些就是 TPC-C 模型中的 9 个数据表。其中,仓库的数量 W 可以根据系统的实际情况进行调整,以使系统性能测试结果达到最佳。

事务类型

该 benchmark 包含 5 类事务:

  • NewOrder:新订单请求

    从某一仓库中随机选取 5 ~ 15 件商品,创建新订单。其中 1% 的事务需要回滚(即 err)。一般地,新订单请求不可能超出全部事务请求的 45%。

  • Payment:订单付款

    更新客户账户余额,反映其支付情况。在全部事务请求中占比 43%。

  • OrderStatus:最近订单查询

    随机选择一个用户,查询其最近一条订单,显示该订单内的每个商品状态。在全部事务请求中占比 4%。

  • Delivery:配送

    模拟批处理交易,更新该订单用户的余额,把发货单从 NewOrder 中删除。在全部事务请求中占比 4%。

  • StockLevel:库存

    缺货状态分析,在全部事务请求中占比 4%。


软件准备

BenchmarkSQL 下载

BenchmarkSQL 是开源项目,官方下载地址为:https://sourceforge.net/projects/benchmarksql/

为节省测试时间,OceanBase 团队对这个程序进行了修改,导入数据报错时,只针对报错的仓库进行补充加载,而不是所有数据重新导入。该版本可以向 OceanBase 技术支持人员获取,或者直接访问链接(https://github.com/obpilot/benchmarksql-5.0)下载。

下载后可直接使用。


注意

需要有 Java 运行环境,且版本不低于 V1.8.0。

[root@obce-0000 bmsql_vivid]# pwd
/root/bmsql_vivid
[root@obce-0000 bmsql_vivid]# tree -L 1
.
├── build
├── build.xml
├── dist
├── doc
├── HOW-TO-RUN.txt
├── lib
├── README.md
├── run
└── src

6 directories, 3 files
[root@obce-0000 bmsql_vivid]#

配置文件

配置文件 props.ob 在 run 目录下。

db=oracle
driver=com.alipay.oceanbase.jdbc.Driver
// conn=jdbc:oceanbase://122.xx.xxx.125:2883/icbc?useUnicode=true&characterEncoding=utf-8
conn=jdbc:oceanbase://172.xx.xxx.52:2883/tpccdb?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true&allowMultiQueries=true
user=tpcc@test#obdemo
password=******

warehouses=10
loadWorkers=2
//fileLocation=/data/temp/

terminals=10
//To run specified transactions per terminal- runMins must equal zero
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 use the
//entire configured database evenly.
terminalWarehouseFixed=true

//The following five values must add up to 100
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

//LoadStartW=1
//LoadStopW=1000

说明:

  • db:指定数据库类型。

    这里复用 OceanBase 的类型。后面 OceanBase 数据库相应的 LIBRARY 放到对应目录下( lib/)。

  • warehouses:指定仓库数。

    仓库数决定性能测试的成绩。如果期较高有望测试结果,仓库数就不能太低。生产环境机器测试,建议 5000 仓库起步。如果机器配置较差,建议 100 仓起步。

  • loadWorkers:指定仓库数据加载时的并发。

    如果机器配置很高,该值可以设置大一些,比如说 100 个。 如果机器配置不高(尤其是内存),该值需要设置小一些,如 10 个并发。并发指定得过高,可能导致内存消耗太快,出现报错,导致数据加载前功尽弃。

    说明

    第一次使用时,建议并发设置低一些,宁可慢一点,也不要报错。

  • terminals:指定性能压测时的并发数。

    建议并发数不要高于仓库数 * 10。否则,会有不必要的锁等待。在生产环境中,该并发数设置到 1000 就很高了。一般环境测试建议从 100 开始。

  • runMins:指定性能测试持续的时间。

    时间越久,越能考验数据库的性能和稳定性。建议不要少于 10 分钟,生产环境中机器建议不少于 1 小时。

  • LoadStartW 和 LoadStopW:指定补仓时的开始值和截止值。

    如果导数据时发现某个仓库数据导入失败(大事务超时),您可以指定这个仓库重新导入。

库文件

OceanBase 数据库提供自己的驱动文件 oceanbase-client-x.x.x.jar 文件。无论是测试 MySQL 租户还是 Oracle 租户,都可以使用这个驱动文件。 驱动文件的读取是脚本 run/func.sh 里的逻辑。

# ----
# getCP()
#
#   Determine the CLASSPATH based on the database system.
# ----
function setCP()
{
    case "$(getProp db)" in
        firebird)
            cp="../lib/firebird/*:../lib/*"
            ;;
        oracle)
            cp="../lib/oracle/*"
            if [ ! -z "${ORACLE_HOME}" -a -d ${ORACLE_HOME}/lib ] ; then
                cp="${cp}:${ORACLE_HOME}/lib/*"
            fi
            cp="${cp}:../lib/*"
            ;;
        postgres)
            cp="../lib/postgres/*:../lib/*"
            ;;
        oceanbase)
            # cp="../lib/oceanbase/oceanbase-client-1.0.1.jar:../lib/oceanbase/guava-parent-18.0-site.jar:../lib/*"
            cp="../lib/oceanbase/*:../lib/*"
            ;;
    esac
    myCP=".:${cp}:../dist/*"
    export myCP
}

因此把 OceanBase 数据库的驱动放到 lib/ 目录或 lib/oracle 下即可。

[root@obce-0000 bmsql_vivid]# tree lib/
lib/
├── apache-log4j-extras-1.1.jar
├── firebird
│   ├── connector-api-1.5.jar
│   └── jaybird-2.2.9.jar
├── gsjdbc4.jar
├── log4j-1.2.17.jar
├── mysql-connector-java-5.1.47.jar
├── oceanbase
│   ├── commons-lang-2.3.jar
│   ├── guava-18.0.jar
│   ├── json-20160810.jar
│   ├── oceanbaseclient1.1.10.jar
│   └── toolkit-common-logging-1.10.jar
├── oracle
│   ├── oceanbaseclient1.1.10.jar
│   └── README.txt
└── postgres
    └── postgresql-9.3-1102.jdbc41.jar

4 directories, 14 files


数据准备

建表

建表脚本通常放在 run/sql.common 下或者其他指定目录下。建表脚本可以选择非分区表方案和分区表方案。

  • 非分区表

    [root@obce-0000 run]# cat sql.common/tableCreates.sql
    create table bmsql_config (
    cfg_name    varchar(30) primary key,
    cfg_value   varchar(50)
    );
    
    create tablegroup tpcc_group ;
    
    create table bmsql_warehouse (
    w_id        integer   not null,
    w_ytd       decimal(12,2),
    w_tax       decimal(4,4),
    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),
    primary key(w_id)
    )tablegroup=tpcc_group;
    
    create table bmsql_district (
    d_w_id       integer       not null,
    d_id         integer       not null,
    d_ytd        decimal(12,2),
    d_tax        decimal(4,4),
    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),
    PRIMARY KEY (d_w_id, d_id)
    )tablegroup=tpcc_group ;
    
    create table bmsql_customer (
    c_w_id         integer        not null,
    c_d_id         integer        not null,
    c_id           integer        not null,
    c_discount     decimal(4,4),
    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),
    PRIMARY KEY (c_w_id, c_d_id, c_id)
    )tablegroup=tpcc_group ;
    
    
    create table 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(6,2),
    h_data   varchar(24)
    )tablegroup=tpcc_group ;
    
    create table bmsql_new_order (
    no_w_id  integer   not null ,
    no_d_id  integer   not null,
    no_o_id  integer   not null,
    PRIMARY KEY (no_w_id, no_d_id, no_o_id)
    )tablegroup=tpcc_group ;
    
    create table 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     integer,
    o_all_local  integer,
    o_entry_d    timestamp,
    PRIMARY KEY (o_w_id, o_d_id, o_id)
    )tablegroup=tpcc_group ;
    
    create table 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       decimal(6,2),
    ol_supply_w_id  integer,
    ol_quantity     integer,
    ol_dist_info    char(24),
    PRIMARY KEY (ol_w_id, ol_d_id, ol_o_id, ol_number)
    )tablegroup=tpcc_group ;
    
    create table bmsql_item (
    i_id     integer      not null,
    i_name   varchar(24),
    i_price  decimal(5,2),
    i_data   varchar(50),
    i_im_id  integer,
    PRIMARY KEY (i_id)
    )tablegroup=tpcc_group;
    
    create table bmsql_stock (
    s_w_id       integer       not null,
    s_i_id       integer       not null,
    s_quantity   integer,
    s_ytd        integer,
    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),
    PRIMARY KEY (s_w_id, s_i_id)
    )tablegroup=tpcc_group;

  • 分区表语法

    分区表是一种水平拆分方案,大部分表按照仓库 ID 做 HASH 分区。分区数取决于要测试的数据规模和机器数。

    如果只有三台机器,分区数以 3 ~ 9 个为宜。如果是 5000 仓,9 台机器,则分区数可以调整到 99 或 100。通常来说 HASH 分区数没必要过 100。

    [root@obce-0000 run]# cat sql.common/tableCreates_parts.sql
    create table bmsql_config (
      cfg_name    varchar(30) primary key,
      cfg_value   varchar(50)
    );
    
    -- drop tablegroup tpcc_group;
    create tablegroup tpcc_group partition by hash partitions 3;
    
    create table bmsql_warehouse (
      w_id        integer   not null,
      w_ytd       decimal(12,2),
      w_tax       decimal(4,4),
      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),
      primary key(w_id)
    )tablegroup='tpcc_group' partition by hash(w_id) partitions 3;
    
    create table bmsql_district (
      d_w_id       integer       not null,
      d_id         integer       not null,
      d_ytd        decimal(12,2),
      d_tax        decimal(4,4),
      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),
      PRIMARY KEY (d_w_id, d_id)
    )tablegroup='tpcc_group' partition by hash(d_w_id) partitions 3;
    
    create table bmsql_customer (
      c_w_id         integer        not null,
      c_d_id         integer        not null,
      c_id           integer        not null,
      c_discount     decimal(4,4),
      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),
      PRIMARY KEY (c_w_id, c_d_id, c_id)
    )tablegroup='tpcc_group' partition by hash(c_w_id) partitions 3;
    
    
    create table 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(6,2),
      h_data   varchar(24)
    )tablegroup='tpcc_group' partition by hash(h_w_id) partitions 3;
    
    create table bmsql_new_order (
      no_w_id  integer   not null ,
      no_d_id  integer   not null,
      no_o_id  integer   not null,
      PRIMARY KEY (no_w_id, no_d_id, no_o_id)
    )tablegroup='tpcc_group' partition by hash(no_w_id) partitions 3;
    
    create table 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     integer,
      o_all_local  integer,
      o_entry_d    timestamp,
      PRIMARY KEY (o_w_id, o_d_id, o_id)
    )tablegroup='tpcc_group' partition by hash(o_w_id) partitions 3;
    
    create table 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       decimal(6,2),
      ol_supply_w_id  integer,
      ol_quantity     integer,
      ol_dist_info    char(24),
      PRIMARY KEY (ol_w_id, ol_d_id, ol_o_id, ol_number)
    )tablegroup='tpcc_group' partition by hash(ol_w_id) partitions 3;
    
    create table bmsql_item (
      i_id     integer      not null,
      i_name   varchar(24),
      i_price  decimal(5,2),
      i_data   varchar(50),
      i_im_id  integer,
      PRIMARY KEY (i_id)
    ) duplicate_scope='cluster';
    
    create table bmsql_stock (
      s_w_id       integer       not null,
      s_i_id       integer       not null,
      s_quantity   integer,
      s_ytd        integer,
      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),
      PRIMARY KEY (s_w_id, s_i_id)
    )tablegroup='tpcc_group' use_bloom_filter=true partition by hash(s_w_id) partitions 3;

运行如下命令建表。

sh runSQL.sh props.ob sql.common/tableCreates_parts.sql

输出:
[root@obce-0000 run]# sh runSQL.sh props.ob sql.common/tableCreates_parts.sql
# ------------------------------------------------------------
# Loading SQL file sql.common/tableCreates_parts.sql
# ------------------------------------------------------------
.:../lib/oracle/*:../lib/*:../dist/*
-Dprop=props.ob -DcommandFile=sql.common/tableCreates_parts.sql

<.....>

加载数据

加载数据即数据初始化,仓库数越多加载时间越长。1000 仓可能要近 1 个小时,5000 仓可能要半天以上。具体性能取决于机器配置。

sh runLoader.sh props.ob

输出:
[root@obce-0000 run]# sh runLoader.sh props.ob
Starting BenchmarkSQL LoadData

driver=com.alipay.oceanbase.jdbc.Driver
conn=jdbc:oceanbase://172.xx.xxx.52:2883/tpccdb?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true&allowMultiQueries=true
user=tpcc@test#obdemo
password=***********
warehouses=10
loadWorkers=2
fileLocation (not defined)
csvNullValue (not defined - using default 'NULL')
LoadStartW (not defined)
LoadStopW (not defined)

Worker 000: Loading ITEM
Worker 001: Loading Warehouse      1
Worker 000: Loading ITEM done
Worker 000: Loading Warehouse      2

<.....>

加载数据的 INSERT SQL 使用了 batch insert 特性,这点是在 props.ob 里的 JDBC URL 里指定的。该特性的写入性能最好。

创建索引

当数据初始化完后再补充两个索引。

[root@obce-0000 run]# cat sql.common/indexCreates.sql
create index bmsql_customer_idx1
  on  bmsql_customer (c_w_id, c_d_id, c_last, c_first) local;
create  index bmsql_oorder_idx1
  on  bmsql_oorder (o_w_id, o_d_id, o_carrier_id, o_id) local;

(可选)删除表

删除表就是删除所有的表和表分组,在需要修改表结构分区数的时候执行。

[root@obce-0000 run]# cat sql.common/tableDrops.sql
drop table bmsql_config;
drop table bmsql_new_order;
drop table bmsql_order_line;
drop table bmsql_oorder;
drop table bmsql_history;
drop table bmsql_customer;
drop table bmsql_stock;
drop table bmsql_item;
drop table bmsql_district;
drop table bmsql_warehouse;

purge recyclebin;

-- tpcc_group
drop tablegroup tpcc_group;

运行命令:

sh runSQL.sh props.ob sql.common/tableDrops.sql

输出:
[root@obce-0000 run]# sh runSQL.sh props.ob sql.common/tableDrops.sql
# ------------------------------------------------------------
# Loading SQL file sql.common/tableDrops.sql
# ------------------------------------------------------------
.:../lib/oracle/*:../lib/*:../dist/*
-Dprop=props.ob -DcommandFile=sql.common/tableDrops.sql
drop table bmsql_config;
pdrop table bmsql_new_order;
wdrop table bmsql_order_line;
drop table bmsql_oorder;
ddrop table bmsql_history;

drop table bmsql_customer;
drop table bmsql_stock;
drop table bmsql_item;
drop table bmsql_district;
drop table bmsql_warehouse;
purge recyclebin;
-- tpcc_group
drop tablegroup tpcc_group;
purge recyclebin;


性能测试

数据初始化没有错误(没有仓库数据报错)即可跑性能测试。建议跑性能测试之前先做一次集群合并( major freeze )。

sh runBenchmark.sh props.ob

输出:
[root@obce-0000 run]# sh runBenchmark.sh props.ob
10:21:44,894 [main] INFO   jTPCC : Term-00,
10:21:44,896 [main] INFO   jTPCC : Term-00, +-------------------------------------------------------------+
10:21:44,896 [main] INFO   jTPCC : Term-00,      BenchmarkSQL v5.0
10:21:44,896 [main] INFO   jTPCC : Term-00, +-------------------------------------------------------------+
10:21:44,896 [main] INFO   jTPCC : Term-00,  (c) 2003, Raul Barbosa
10:21:44,896 [main] INFO   jTPCC : Term-00,  (c) 2004-2016, Denis Lussier
10:21:44,898 [main] INFO   jTPCC : Term-00,  (c) 2016, Jan Wieck
10:21:44,898 [main] INFO   jTPCC : Term-00, +-------------------------------------------------------------+
10:21:44,898 [main] INFO   jTPCC : Term-00,
10:21:44,898 [main] INFO   jTPCC : Term-00, db=oracle
10:21:44,898 [main] INFO   jTPCC : Term-00, driver=com.alipay.oceanbase.jdbc.Driver
10:21:44,898 [main] INFO   jTPCC : Term-00, conn=jdbc:oceanbase://172.xx.xxx.52:2883/tpccdb?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true&allowMultiQueries=true
10:21:44,898 [main] INFO   jTPCC : Term-00, user=tpcc@test#obdemo
10:21:44,898 [main] INFO   jTPCC : Term-00,
10:21:44,899 [main] INFO   jTPCC : Term-00, warehouses=10
10:21:44,899 [main] INFO   jTPCC : Term-00, terminals=10
10:21:44,900 [main] INFO   jTPCC : Term-00, runMins=10
10:21:44,900 [main] INFO   jTPCC : Term-00, limitTxnsPerMin=0
10:21:44,900 [main] INFO   jTPCC : Term-00, terminalWarehouseFixed=true
10:21:44,900 [main] INFO   jTPCC : Term-00,
10:21:44,900 [main] INFO   jTPCC : Term-00, newOrderWeight=45
10:21:44,900 [main] INFO   jTPCC : Term-00, paymentWeight=43
10:21:44,900 [main] INFO   jTPCC : Term-00, orderStatusWeight=4
10:21:44,901 [main] INFO   jTPCC : Term-00, deliveryWeight=4
10:21:44,901 [main] INFO   jTPCC : Term-00, stockLevelWeight=4
10:21:44,901 [main] INFO   jTPCC : Term-00,
10:21:44,901 [main] INFO   jTPCC : Term-00, resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
10:21:44,901 [main] INFO   jTPCC : Term-00, osCollectorScript=./misc/os_collector_linux.py
10:21:44,901 [main] INFO   jTPCC : Term-00,
10:21:44,925 [main] INFO   jTPCC : Term-00, copied props.ob to my_result_2021-10-01_102144/run.properties
10:21:44,926 [main] INFO   jTPCC : Term-00, created my_result_2021-10-01_102144/data/runInfo.csv for runID 326
10:21:44,926 [main] INFO   jTPCC : Term-00, writing per transaction results to my_result_2021-10-01_102144/data/result.csv
10:21:44,926 [main] INFO   jTPCC : Term-00, osCollectorScript=./misc/os_collector_linux.py
10:21:44,926 [main] INFO   jTPCC : Term-00, osCollectorInterval=1
10:21:44,927 [main] INFO   jTPCC : Term-00, osCollectorSSHAddr=null
10:21:44,927 [main] INFO   jTPCC : Term-00, osCollectorDevices=null
10:21:45,031 [main] INFO   jTPCC : Term-00,
10:21:45,611 [main] INFO   jTPCC : Term-00, C value for C_LAST during load: 144
10:21:45,613 [main] INFO   jTPCC : Term-00, C value for C_LAST this run:    215
10:21:45,614 [main] INFO   jTPCC : Term-00,

0:21:45,611 [main] INFO   jTPCC : Term-00, C value for C_LAST during load: 14Term-00, Running Average tpmTOTAL: 5376.32    Current tpmTOTAL: 356448    Memory Usage: 44MB / 366MB                        10:31:46,707 [Thread-7] INFO   jTPCC : Term-00,                                                                                                                                                           10:31:46,707 [Thread-7] INFO   jTPCC : Term-00,                                                                                                                                                           10:31:46,707 [Thread-7] INFO   jTPCC : Term-00, Measured tpmC (NewOrders) = 2410.28
10:31:46,708 [Thread-7] INFO   jTPCC : Term-00, Measured tpmTOTAL = 5376.33
10:31:46,708 [Thread-7] INFO   jTPCC : Term-00, Session Start     = 2021-10-01 10:21:46
10:31:46,708 [Thread-7] INFO   jTPCC : Term-00, Session End       = 2021-10-01 10:31:46
10:31:46,708 [Thread-7] INFO   jTPCC : Term-00, Transaction Count = 53776
[root@obce-0000 run]#

TPC-C 用 tpmC 值(Transactions per Minute)来衡量系统最大有效吞吐量。其中 Transactions 以 NewOrder Transaction 为准,即最终衡量单位为每分钟处理的订单数。


性能调优

性能测试的结果取决于租户资源大小、内存转储的设置、客户端的性能(JVM 的大小)等等。

转储与合并

对比项合并转储前合并后提升率
bmsql(1000 仓、600 并发 tpmc)230211.65264401.0311.30%

调整 PRIMARY_ZONE

对比项集中式部署(zone1)random 部署
bmsql88592.24264401.03

使用 TABLEGROUP

使用 table_group 可以减少分布式查询和事务,提升性能。

对比项未使用 pg使用 pg
bmsql60383.72250249.36


常见问题

  • Could not find the main class: ExecJDBC. Program will exit.

    解决方法:

    • 升级 JDK

    • 升级 JDBC 版本

    • 确认 oceanbase-client-x.x.x.jar 是否在指定路径下

  • Invalid number of terminals!

    • 原因:这种情况是由 my_oracle.properties 中设置的 terminals 值不对而造成的。

    • 解决方法:填写正确范围内的 terminals 值 numTerminals <= 0 || numTerminals > 10*numWarehouses

  • 事务超时报错 transaction timeout

    解决方法:需增大超时时间,建议为 36000000000

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论