BenchmarkSQL5.0 压力测试SinoDB

1 前言

  BenchmarkSQL是一个用于执行数据库性能测试的开源工具,BenchmarkSQL旨在模拟多个用户同时访问数据库的情况,以评估数据库系统在高负载情况下的性能表现。

  以下是BenchmarkSQL 5.0的主要特点和介绍:

多用户支持:BenchmarkSQL可以模拟多个用户同时访问数据库,每个用户可以执行各种SQL查询和事务。
可配置性:用户可以根据自己的需求配置测试参数,包括并发用户数、运行时间、数据库连接信息、SQL查询类型等。
性能度量:BenchmarkSQL提供了各种性能度量指标,包括吞吐量、响应时间、事务吞吐量等,以帮助用户评估数据库系统的性能。
支持多种数据库:BenchmarkSQL支持多种数据库系统,包括SinoDB、Oracle、MySQL、PostgreSQL等,这使得它成为一个通用的性能测试工具。
图形用户界面:BenchmarkSQL 5.0提供了一个图形用户界面,使用户可以更轻松地配置和监视性能测试。
事务模型:该工具支持不同类型的事务模型,包括读写事务、只读事务等,以模拟真实世界的数据库应用场景。
可扩展性:您可以自定义SQL查询以满足您的特定测试需求,并将它们集成到BenchmarkSQL中。
开源:BenchmarkSQL是开源软件,可以根据需要进行修改和定制。
文档和社区支持:BenchmarkSQL拥有广泛的文档和社区支持,使用户能够轻松入门并解决问题。

  BenchmarkSQL是一个强大的工具,可用于评估数据库系统的性能,特别是在高负载情况下。通过使用BenchmarkSQL,您可以确定数据库在不同负载条件下的性能极限,并识别潜在的性能瓶颈,以便进行优化和调整。请注意,由于软件版本可能已经更新,建议查看官方网站或文档以获取最新信息和下载链接。

2 bmsql安装前准备

2.1 java openjdk1.7 安装

安装命令:

# yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y

确认java 版本

java -version

image

2.2 apache ant 安装

apache ant 软件包用于编译java项目。
安装命令

#yum install ant -y

确认ant安装

#ant -version

3 安装bmsql

下载软件bmsql

# cd /opt
# wget https://nchc.dl.sourceforge.net/project/benchmarksql/benchmarksql-5.0.zip

解压软件

# unzip benchmarksql-5.0.zip

编译

# cd benchmarksql-5.0
# ant

4 修改bmsql源码添加SinoDB支持

4.1 修改funcs.sh文件

# cd /opt/benchmarksql-5.0/run
# vim funcs.sh

4.2 修改 jTPCC.java

# cd /opt/benchmarksql-5.0/src/client
# vim jTPCC.java

4.3 修改os_collector_linux.py

# cd /opt/benchmarksql-5.0/run/misc
# vim os_collector_linux.py

image

  • 第165行最后红色方框里的数字,根据/proc/stat 列数决定,本例中cpu 列数为11列,红色圈内数字为cpu列数减去1,最后为10。
  • 删除181行中红色方框,‘cpu_guest_nice’。

4.3 编译

# cd /opt/benchmarksql-5.0/
# ant

5 上传jdbc、修改配置文件、准备sql脚本

5.1 上传jdbc

# cd /opt/benchmarksql-5.0/lib
# mkdir sinodb

将sinodb的jdbc文件上传到该目录。

5.2创建配置文件

# cd /opt/benchmarksql-5.0/run
# cp props.ora props.sino
# vim props.sino

  • 主要关注红框部分配置内容。最后一项配置中em1为网卡名、dm-2为数据库数据文件所在磁盘名。配置文件详解请参考附录部分。

5.3 准备sql脚本

# cd /opt/benchmarksql-5.0/run
# mkdir sql.sinodb
# cp sql.common/*.sql sql.sinodb/

6 使用bmsql进行测试

6.1 修改props.sino配置文件配置参数

主要关注以下参数:

  • warehouses: 1warehouse的数据库约为70M
  • loadworkers: 数据加载进程数
  • runTxnsPerTerminal: 每个终端运行的固定事务数量,若启用则runMins必须设为0
  • runMins: 测试的持续时间(单位:分钟),若启用则runTxnsPerTerminal必须设为0
  • limitTxnsPerMin: 每分钟事务处理上限,测试吞吐量时需设置0,表示不设置上限

6.2 确认数据库空间以及逻辑日志空间

  • 根据5.1中设置的warehouse值,判断目前的dbspace是否够用,不够则追加数据块;
  • 数据加载过程中有可能会遇到长事务导致中断的问题,需要事先确认当前的数据加载进程数与逻辑日志大小、个数、吃水线配置。如测试环境硬件资源充足,可配置200M*100的逻辑日志。

6.3 开始测试

  • 1、建库
 $ echo “create database benchmarksql in dbs1 with  log;” | dbaccess - 

根据实际情况选择数据库存储位置;必须启用逻辑日志以支持事务操作.

  • 2、 运行runDatabaseBuild.sh
    该脚本用于创建表、加载数据、创建索引、约束。
# cd /opt/benchmarksql-5.0/run
# ./runDatabaseBuild.sh props.sino
  • 3、运行runBenchmark.sh
    测试脚本
# ./runBenchmark.sh props.sino

测试脚本执行结束将会输出如下图所示的信息:


若想重新测试,需执行 runDatabaseDestroy.sh 删除数据表后,再次执行第二和第三步骤。

6.4 生成报告

  • 安装R语言环境
# yum install texinfo-tex libjpeg-turbo -y
# yum install epel-release -y
# yum install R -y
  • 执行报告生成脚本
# ./generateReport.sh my_result_2020-09-22_084417

  runBenchmark.sh执行完后会在run目录下生成my_resule_YYYY-MM-DD_hhmmss格式的执行结果文件夹,里面包含本次运行的配置参数以及吞吐量、系统各项资源数据等。执行完生成报告的脚本后使用浏览器打开report.html即可。

  • 附件一:props.sino配置参数详解
    ■db: db类型,需与funcs.sh以及 jTPCC.java中定义的一致;
    ■driver: jdbc驱动;
    ■conn: 数据库连接字符串;
    ■user: 数据库用户名;
    ■password: 数据库用户密码;
    ■warehouses: 要加载的仓库数量,1个仓库数据量约为70M;
    ■loadWorkers: 加载数据进程数;
    ■terminals: 终端数,即并发客户端数量;
    ■runTxnsPerTerminal: 每个终端运行的固定事务数量,若启用则runMins必须设为0;
    ■runMins: 测试的持续时间(单位:分钟),若启用则runTxnsPerTerminal必须设为0;
    ■limitTxnsPerMin: 每分钟事务处理上限,测试吞吐量时需设置为0,表示不设置上限;
    ■terminalWarehouseFixed: 终端和仓库的绑定模式,每个终端都有一个固定的仓库;
    ■newOrderWeight: 操作比重,默认值与TPC-C规定的一致,无需修改;
    ■paymentWeight: 操作比重,默认值与TPC-C规定的一致,无需修改;
    ■orderStatusWeight: 操作比重,默认值与TPC-C规定的一致,无需修改;
    ■deliveryWeight: 操作比重,默认值与TPC-C规定的一致,无需修改;
    ■stockLevelWeight: 操作比重,默认值与TPC-C规定的一致,无需修改;
    ■resultDirectory: 测试结果存放路径;
    ■osCollectorScript: 操作系统性能收集脚本,OS要有python环境;
    ■osCollectorInterval: 操作系统性能收集间隔,单位:秒;
    ■osCollectorSSHAddr: 操作体统性能收集对象服务器,若收集本机则注释掉即可,反之需事先配置测试机与被测机单向免密登录;
    ■osCollectorDevices: 收集的网卡与磁盘。

  • 附件二:创建表、索引、外键sql脚本
    tableCreates.sql:

create table bmsql_config (
  cfg_name    varchar(30) primary key,
  cfg_value   varchar(50)
);
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)
);
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)
);
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  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        datetime year to second,
  c_middle       char(2),
  c_data         char(500)
);
create sequence bmsql_hist_id_seq;
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   datetime year to second,
  h_amount decimal(6,2),
  h_data   varchar(24)
);
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     decimal(2,0),
  o_all_local  decimal(1,0),
  o_entry_d    datetime year to second
);
create table bmsql_new_order (
  no_w_id  integer   not null,
  no_d_id  integer   not null,
  no_o_id  integer   not null
);
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   datetime year to second,
  ol_amount       decimal(6,2),
  ol_supply_w_id  integer,
  ol_quantity     decimal(2,0),
  ol_dist_info    char(24)
);
create table bmsql_stock (
  s_w_id       integer       not null,
  s_i_id       integer       not null,
  s_quantity   decimal(4,0),
  s_ytd        decimal(8,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)
);
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
);

indexCreates.sql:

alter table bmsql_warehouse add constraint
  primary key (w_id) constraint bmsql_warehouse_pkey;
alter table bmsql_district add constraint
  primary key (d_w_id, d_id) constraint bmsql_district_pkey;
alter table bmsql_customer add constraint
  primary key (c_w_id, c_d_id, c_id) constraint bmsql_customer_pkey;
create index bmsql_customer_idx1
  on  bmsql_customer (c_w_id, c_d_id, c_last, c_first);
alter table bmsql_oorder add constraint
  primary key (o_w_id, o_d_id, o_id) constraint bmsql_oorder_pkey;
create unique index bmsql_oorder_idx1
  on  bmsql_oorder (o_w_id, o_d_id, o_carrier_id, o_id);
alter table bmsql_new_order add constraint
  primary key (no_w_id, no_d_id, no_o_id) constraint bmsql_new_order_pkey;
alter table bmsql_order_line add constraint
  primary key (ol_w_id, ol_d_id, ol_o_id, ol_number) constraint bmsql_order_line_pkey;
alter table bmsql_stock add constraint
  primary key (s_w_id, s_i_id) constraint bmsql_stock_pkey;
alter table bmsql_item add constraint
  primary key (i_id) constraint bmsql_item_pkey;

foreignKeys.sql:

alter table bmsql_district add constraint
    foreign key (d_w_id)
    references bmsql_warehouse (w_id)
    constraint d_warehouse_fkey;
alter table bmsql_customer add constraint
    foreign key (c_w_id, c_d_id)
references bmsql_district (d_w_id, d_id)
    constraint c_district_fkey;
alter table bmsql_history add constraint
    foreign key (h_c_w_id, h_c_d_id, h_c_id)
    references bmsql_customer (c_w_id, c_d_id, c_id)
    constraint  h_customer_fkey;
alter table bmsql_history add constraint
    foreign key (h_w_id, h_d_id)
    references bmsql_district (d_w_id, d_id)
    constraint h_district_fkey;
alter table bmsql_new_order add constraint
    foreign key (no_w_id, no_d_id, no_o_id)
    references bmsql_oorder (o_w_id, o_d_id, o_id)
    constraint no_order_fkey;
alter table bmsql_oorder add constraint
    foreign key (o_w_id, o_d_id, o_c_id)
    references bmsql_customer (c_w_id, c_d_id, c_id)
    constraint o_customer_fkey;
alter table bmsql_order_line add constraint
    foreign key (ol_w_id, ol_d_id, ol_o_id)
    references bmsql_oorder (o_w_id, o_d_id, o_id)
    constraint ol_order_fkey;
alter table bmsql_order_line add constraint
    foreign key (ol_supply_w_id, ol_i_id)
    references bmsql_stock (s_w_id, s_i_id)
    constraint ol_stock_fkey;
alter table bmsql_stock add constraint
    foreign key (s_w_id)
    references bmsql_warehouse (w_id)
    constraint s_warehouse_fkey;
alter table bmsql_stock add constraint
    foreign key (s_i_id)
    references bmsql_item (i_id)
    constraint s_item_fkey;