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
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
- 第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;