使用BenchmarkSQL对OceanBase进行测试的步骤
OceanBase打榜很牛,这个大家都知道,TPCC/TPCH都拿过世界第一了。
平时我们在进行数据库测试的时候,也会经常用到BenchmarkSQL,今天我们就来尝试一下如何使用BenchmarkSQL在OceanBase上进行测试。
本文部分参数配置参考了Oceanbase官方指导:https://zhuanlan.zhihu.com/p/112894850 由于开源版本不支持Oracle,所以本文采用MySQL模式测试,过程可能略有不同。
1.准备OceanBase测试环境
与测试任何数据库一样,首先我们需要准备好OceanBase测试集群,这里假设您已经正常安装并启动了一套集群。下面我们主要介绍如何为BenchmarkSQL准备测试环境。
1.1 创建新租户
创建租户使用以下三步,使用obclient登录系统租户后,创建资源单元、资源池和新租户test_tenant:
MySQL [oceanbase]> CREATE RESOURCE UNIT unit1 MAX_CPU 1, MAX_MEMORY '1G', MAX_IOPS 128,MAX_DISK_SIZE '10G', MAX_SESSION_NUM 64, MIN_CPU=1, MIN_MEMORY='1G', MIN_IOPS=128;
Query OK, 0 rows affected (0.01 sec)MySQL [oceanbase]> CREATE RESOURCE POOL pool1 UNIT='unit1',UNIT_NUM=1,ZONE_LIST=('zone1','zone2','zone3');
Query OK, 0 rows affected (0.03 sec)MySQL [oceanbase]> CREATE TENANT IF NOT EXISTS test_tenant CHARSET='utf8mb4',ZONE_LIST=('zone1','zone2','zone3'), PRIMARY_ZONE='zone1;zone2,zone3', RESOURCE_POOL_LIST=('pool1') SET ob_tcp_invited_nodes='%' ;
Query OK, 0 rows affected (1.12 sec)
1.2 创建测试用户
由于我们上面创建了新的租户,所以这里登录时一定要采用root用户登录到新租户,然后进行权限处理,否则后面会出现 Access Denied
的错误哦。
[admin@obproxy ~]$ obclient -h 10.211.55.54 -uroot@test_tenant -P2883 -c -A oceanbase -pcreate user 'tpcc' identified by 'tpcc';
grant all privileges on tpcc.* to tpcc with grant option ;
grant create, drop, insert, delete, update, select on *.* to tpcc;
1.3 修改observer参数
(1) sys租户参数修改
BenchmarkSQL会加载大量数据,短时间内对OceanBase内存消耗速度会很快,因此需要针对内存冻结合并和限流参数做一些调优。在sys租户执行:
ALTER SYSTEM SET enable_merge_by_turn=FALSE;
ALTER SYSTEM set minor_freeze_times=100;
ALTER SYSTEM set freeze_trigger_percentage=70;
ALTER SYSTEM set writing_throttling_trigger_percentage=70 tenant='test_tenant';
ALTER SYSTEM set writing_throttling_maximum_duration='10m' tenant='test_tenant';
show parameters where name in ('minor_freeze_times','freeze_trigger_percentage');
注意:业务租户限流参数的修改是在sys租户里,需要指定相应的租户名。然后查看确认需要到业务租户里。
在业务租户执行:
SHOW parameters WHERE name IN ('writing_throttling_trigger_percentage','writing_throttling_maximum_duration');
(2) 业务租户参数修改
OceanBase跟Oracle/MySQL相比,会有个默认SQL超时和事务超时机制。这个可能会导致后面查看修改数据的SQL报错。所以先修改一下这些参数。
set global recyclebin=off;
set global ob_query_timeout=1000000000;
set global ob_trx_idle_timeout=1200000000;
set global ob_trx_timeout=1000000000;
1.4 修改obproxy参数
OBProxy是OceanBase的访问代理,其内部一些参数也可能影响性能。如下面的压缩参数对CPU有一定消耗,测试时可以关闭。
$ obclient -h127.1 -uroot@sys#test_tenant -P2883 -p -c -A oceanbasealter proxyconfig set enable_compression_protocol=False;
show proxyconfig like 'enable_compression_protocol';
参数修改后,需要重启obproxy,直接执行如下命令即可:
kill -9 `pidof obproxy`
2.准备BenchmarkSQL
BenchmarkSQL 官方下载地址是: https://sourceforge.net/projects/benchmarksql/ ,下载后需要先做MySQL的适配(新版本程序去掉了对MySQL的支持),然后参考 HOW-TO-RUN.txt 中说明先编译安装BenchmarkSQL。有关如何适配MySQL的代码修改,大家可以自行百度一下。我参考了该文章:http://www.weijingbiji.com/1838/ , 这里给大家简单摘录一下需要修改的内容:
2.1 修改benchmarksql-5.0/src/client/jTPCC.java
增加mysql相关部分,如下所示:
if (iDB.equals("firebird"))dbType = DB_FIREBIRD;else if (iDB.equals("oracle"))dbType = DB_ORACLE;else if (iDB.equals("postgres"))dbType = DB_POSTGRES;else if (iDB.equals("mysql"))dbType = DB_UNKNOWN;else{log.error("unknown database type '" + iDB + "'");return;}
2.2 修改benchmarksql-5.0/src/client/jTPCCConnection.java
SQL子查询增加”AS L”别名,如下所示:
default:stmtStockLevelSelectLow = dbConn.prepareStatement("SELECT count(*) AS low_stock FROM (" +" SELECT s_w_id, s_i_id, s_quantity " +" FROM bmsql_stock " +" WHERE s_w_id = ? AND s_quantity < ? AND s_i_id IN (" +" SELECT ol_i_id " +" FROM bmsql_district " +" JOIN bmsql_order_line ON ol_w_id = d_w_id " +" AND ol_d_id = d_id " +" AND ol_o_id >= d_next_o_id - 20 " +" AND ol_o_id < d_next_o_id " +" WHERE d_w_id = ? AND d_id = ? " +" ) " +" )AS L");break;
2.3 软件编译
BenchmarkSQL需要JDK 1.7以上的环境,并且需要apache ant的支持,请您务必提前安装:
yum install java
yum install ant
以上软件安装好后,可以执行软件编译了:
cd benchmarksql-5.0
ant
编译完成后,可执行的文件都在benchmarksql-5.0/run文件夹下:
$ ll
total 112
-rwxr-xr-x@ 1 chris staff 1.1K 4 13 07:49 funcs.sh
-rwxr-xr-x@ 1 chris staff 2.1K 5 26 2016 generateGraphs.sh
-rwxr-xr-x@ 1 chris staff 7.1K 5 26 2016 generateReport.sh
-rwxr-xr-x@ 1 chris staff 962B 5 26 2016 log4j.properties
drwxrwxr-x@ 11 chris staff 352B 5 26 2016 misc
-rw-r--r-- 1 chris staff 1.0K 4 13 07:54 prop.mysql
-rw-rw-r--@ 1 chris staff 1.0K 5 26 2016 props.fb
-rw-rw-r--@ 1 chris staff 947B 5 26 2016 props.ora
-rw-rw-r--@ 1 chris staff 1.0K 5 26 2016 props.pg
-rwxr-xr-x@ 1 chris staff 385B 5 26 2016 runBenchmark.sh
-rwxr-xr-x@ 1 chris staff 516B 4 13 07:50 runDatabaseBuild.sh
-rwxr-xr-x@ 1 chris staff 330B 5 26 2016 runDatabaseDestroy.sh
-rwxr-xr-x@ 1 chris staff 200B 5 26 2016 runLoader.sh
-rwxr-xr-x@ 1 chris staff 1.2K 5 26 2016 runSQL.sh
drwxrwxr-x@ 9 chris staff 288B 5 26 2016 sql.common
drwxrwxr-x@ 3 chris staff 96B 5 26 2016 sql.firebird
drwxrwxr-x@ 3 chris staff 96B 5 26 2016 sql.oracle
drwxrwxr-x@ 5 chris staff 160B 5 26 2016 sql.postgres
2.4 benchmarksql-5.0/run/funcs.sh脚本适配
我们需要在该脚本中添加mysql 数据库类型:
function setCP()
{case "$(getProp db)" infirebird)cp="../lib/firebird/*:../lib/*";;oracle)cp="../lib/oracle/*"if [ ! -z "${ORACLE_HOME}" -a -d ${ORACLE_HOME}/lib ] ; thencp="${cp}:${ORACLE_HOME}/lib/*"ficp="${cp}:../lib/*";;postgres)cp="../lib/postgres/*:../lib/*";;mysql)cp="../lib/mysql/*:../lib/*";;esacmyCP=".:${cp}:../dist/*"export myCP
}...省略case "$(getProp db)" infirebird|oracle|postgres|mysql);;"") echo "ERROR: missing db= config option in ${PROPS}" >&2exit 1;;*) echo "ERROR: unsupported database type 'db=$(getProp db)' in ${PROPS}" >&2exit 1;;
esac
2.5 benchmarksql-5.0/run/runDatabaseBuild.sh脚本适配
需要将该脚本中的extraHistID去掉:
AFTER_LOAD="indexCreates foreignKeys extraHistID buildFinish"
修改为:
AFTER_LOAD="indexCreates foreignKeys buildFinish"
2.6 添加mysql java connector驱动
自行到MySQL官网下载一个驱动jar包,放到lib目录下即可:
mkdir -p benchmarksql-5.0/lib/mysql
cp mysql-connector-java-5.1.45.jar benchmarksql-5.0/lib/mysql/
2.7 准备BenchmarkSQL测试配置文件props.ob
最后我们需要准备测试配置文件,以后的测试通过修改该文件中的内容便可调整测试数据集及并发等内容,这里给出一个最基础的参考:
db=mysql
driver=com.mysql.jdbc.Driver
conn=jdbc:mysql://127.0.0.1:3306/benchmarksql
user=benchmarksql
password=123456
warehouses=1
loadWorkers=4
terminals=1
//To run specified transactions per terminal- runMins must equal zero
runTxnsPerTerminal=10
//To run for specified minutes- runTxnsPerTerminal must equal zero
runMins=0
//Number of total transactions per minute
limitTxnsPerMin=300
//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
//The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec
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
3.执行TPCC测试
接下来我们要开始测试了,测试过程基本是自动化的,如果出现权限无法访问的问题,还请到上面的赋权操作中去确认是否登录到了正确的租户,把权限给了正确的用户。
3.1 构建测试仓库
执行命令:
cd benchmarksql-5.0/run
./runDatabaseBuild.sh props.ob
该操作会在tpcc用户下创建一系列表,并初始化数据。创建过程中可能会存在一些语法不支持的问题,我这里暂时忽略了,不影响后续测试。
3.2 执行测试
执行命令:
./runBenchmark.sh props.ob
执行日志如下:
$ ./runBenchmark.sh props.ob09:02:35,339 [main] INFO jTPCC : Term-00,
09:02:35,341 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
09:02:35,341 [main] INFO jTPCC : Term-00, BenchmarkSQL v5.0
09:02:35,341 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
09:02:35,342 [main] INFO jTPCC : Term-00, (c) 2003, Raul Barbosa
09:02:35,342 [main] INFO jTPCC : Term-00, (c) 2004-2016, Denis Lussier
09:02:35,343 [main] INFO jTPCC : Term-00, (c) 2016, Jan Wieck
09:02:35,343 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
09:02:35,343 [main] INFO jTPCC : Term-00,
09:02:35,351 [main] INFO jTPCC : Term-00, db=mysql
09:02:35,351 [main] INFO jTPCC : Term-00, driver=com.mysql.jdbc.Driver
09:02:35,351 [main] INFO jTPCC : Term-00, conn=jdbc:mysql://10.211.55.54:2883/test2
09:02:35,351 [main] INFO jTPCC : Term-00, user=tpcc@test_tenant
09:02:35,352 [main] INFO jTPCC : Term-00,
09:02:35,352 [main] INFO jTPCC : Term-00, warehouses=1
09:02:35,352 [main] INFO jTPCC : Term-00, terminals=1
09:02:35,355 [main] INFO jTPCC : Term-00, runTxnsPerTerminal=10
09:02:35,355 [main] INFO jTPCC : Term-00, limitTxnsPerMin=300
09:02:35,355 [main] INFO jTPCC : Term-00, terminalWarehouseFixed=true
09:02:35,355 [main] INFO jTPCC : Term-00,
09:02:35,355 [main] INFO jTPCC : Term-00, newOrderWeight=45
09:02:35,355 [main] INFO jTPCC : Term-00, paymentWeight=43
09:02:35,355 [main] INFO jTPCC : Term-00, orderStatusWeight=4
09:02:35,355 [main] INFO jTPCC : Term-00, deliveryWeight=4
09:02:35,356 [main] INFO jTPCC : Term-00, stockLevelWeight=4
09:02:35,356 [main] INFO jTPCC : Term-00,
09:02:35,356 [main] INFO jTPCC : Term-00, resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
09:02:35,356 [main] INFO jTPCC : Term-00, osCollectorScript=null
09:02:35,356 [main] INFO jTPCC : Term-00,
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
09:02:35,377 [main] INFO jTPCC : Term-00, copied props.ob to my_result_2022-04-13_090235/run.properties
09:02:35,382 [main] INFO jTPCC : Term-00, created my_result_2022-04-13_090235/data/runInfo.csv for runID 2
09:02:35,383 [main] INFO jTPCC : Term-00, writing per transaction results to my_result_2022-04-13_090235/data/result.csv
09:02:35,383 [main] INFO jTPCC : Term-00,
09:02:35,681 [main] INFO jTPCC : Term-00, C value for C_LAST during load: 57
09:02:35,681 [main] INFO jTPCC : Term-00, C value for C_LAST this run: 140
09:02:35,681 [main] INFO jTPCC : Term-00,
Term-00, Running Average tpmTOTAL: 22.82 Current tpmTOTAL: 96 Memory Usage: 29MB / 1024MB
09:03:04,765 [Thread-0] INFO jTPCC : Term-00,
09:03:04,766 [Thread-0] INFO jTPCC : Term-00,
09:03:04,767 [Thread-0] INFO jTPCC : Term-00, Measured tpmC (NewOrders) = 6.19
09:03:04,767 [Thread-0] INFO jTPCC : Term-00, Measured tpmTOTAL = 22.72
09:03:04,767 [Thread-0] INFO jTPCC : Term-00, Session Start = 2022-04-13 09:02:35
09:03:04,768 [Thread-0] INFO jTPCC : Term-00, Session End = 2022-04-13 09:03:04
09:03:04,768 [Thread-0] INFO jTPCC : Term-00, Transaction Count = 10
4.结果分析与调优
下面我们修改props.ob,提高一下并发数和仓库数重新压测一下,然后分析一下测试结果。
4.1 重新压测
将props.ob中的terminals改为5,warehouses改为20,重新测试:
$ ./runBenchmark.sh props.ob
4.2 TPC-C TOP SQL分析
此时我们需要登录到sys租户进行TOP SQL分析:
SELECT sql_id, count(*), round(avg(elapsed_time)) avg_elapsed_time, round(avg(execute_time)) avg_exec_time FROM gv$sql_audit s WHERE 1=1 and user_name='tpcc' and request_time >= time_to_usec(DATE_SUB(current_timestamp, INTERVAL 30 MINUTE) ) GROUP BY sql_id order by avg_elapsed_time desc limit 10;
我们通过以下语句拿到具体的查询SQL语句:
# 使用语句如下:
select distinct query_sql from gv$sql_audit where sql_id='xxx';
4.2.1 查看解析执行计划
由于我这里运行完成后,大部分的慢SQL都是SET或CREATE INDEX操作,下面我用仅有的一个查询给大家演示一下如何查看解析执行计划和实际的执行计划,首先我们可以根据上面的sql_id拿到查询语句:
解析执行计划只需要在语句前加上explain语法即可,并不会真的执行,如下:
4.2.2 查看真实执行计划
真实执行计划是记录在数据库管理视图中的内容,表示该SQL真实的执行过程,可以通过管理视图:vplancacheplanstat和vplan_cache_plan_stat和vplancacheplanstat和vplan_cache_plan_explain查看
查询得到plan_id
# 查询得到plan_id
SELECT * FROM v$plan_cache_plan_stat WHERE tenant_id= 1001 AND STATEMENT LIKE 'SELECT cfg_value FROM bmsql_config%'\G
通过plan_id查询真实执行计划
SELECT * FROM v$plan_cache_plan_explain WHERE tenant_id = 1001 AND plan_id = 201;
5.写在最后
至此为止,将《使用BenchmarkSQL对OceanBase进行测试的步骤》就完成了,欢迎大家添加博主交流。
最后,如果觉得文章对您有帮助,请给博主点赞、收藏、关注,博主会不断推出更多优质的文章。
使用BenchmarkSQL对OceanBase进行测试的步骤相关推荐
- 压测工具BenchmarkSQL对OceanBase开源版3.1.2性能测试调优
作者:马顺华 从事运维管理工作多年,目前就职于六棱镜(杭州)科技有限公司,熟悉运维自动化.OceanBase部署运维.MySQL 运维以及各种云平台技术和产品.并已获得OceanBase认证OBCA. ...
- 实践练习六(必选):OceanBase TPC-C 测试和查看 执行计划
实践练习六(必选):OceanBase TPC-C 测试和查看 执行计划 练习目的 本次练习目的掌握 OceanBase 的执行计划查看方法,包括 explain 命令和查看实际执行计划. 练习条件 ...
- 经验分享:布线测试关键步骤有哪些 ?
我们都知道在布线完成之后都免不了布线测试这一环节,但是常常会被忽略几个布线测试关键步骤.今天小编就来说说布线测试关键步骤有哪些. 布线测试关键步骤有哪些:通断测试是基础 通断测试是测试的基础,是对线路 ...
- 申请支付宝授权,提现测试环境步骤
申请支付宝授权,提现测试环境步骤: 1.登陆自己的支付宝账号: https://developers.alipay.com/dev/workspace/register?from=http%3A%2F ...
- 测试的步骤(功能测试)
上文已说测试的相关概念.那么这篇文章将讲一下怎么测试. 其实测试很简单.就是模拟用户操作.做功能的戏称点点点. 比如场景法,就是走一遍流程. 什么叫流程呢? 第一次使用某宝买东西,注册.登 ...
- 常见压力测试流程步骤
常见压力测试流程步骤: 1.明确压力测试需求.范围.场景.首先得确定测试数据库.测试用例设计等,因为压力测试对于环境的要求较高,因此基本软硬件.工具类以及测试场景的搭建都要准备好. 2.存量数据规模. ...
- web渗透测试基本步骤
基本常见步骤: 一 .信息收集 要检测一个站首先应先收集信息如whois信息.网站真实IP.旁注.C段网站.服务器系统版本.容器版本.程序版本.数据库类型.二级域名.防火墙.维护者信息有哪些等等 ...
- 红外测试操作步骤_红外传感实验操作步骤及数据分析(无测试实图)
红外传感实验操作步骤及数据分析(无测试实图) 1. 启动红外传感模块 红外传感模块工作实图 ( 1 ) 将 NEWlab 实验硬件平台通电并与电脑链接. ( 2 ) 将红外传感模块放置在 NEWlab ...
- 利用 Selenium 自动化 web 测试【步骤详解】
简介 Selenium 是一个健壮的工具集合,跨很多平台支持针对基于 web 的应用程序的测试自动化的敏捷开发.它是一个开源的.轻量级的自动化工具,很容易集成到各种项目中,支持多种编程语言,比如 .N ...
最新文章
- matlab绘制圆,且求解两个圆的交点坐标
- Cesar竞赛平台项目中期总结
- Navicat和DBeaver的查询快捷键
- lstm结构图_神经网络——单层LSTM
- VTK:相互作用之ImageRegion
- 30分钟轻松入门Spring MVC
- Python 手把手实现远程控制桌面
- python os 常用方法_【Python 库】os 模块常用方法简介
- python语音信号快速傅里叶变换
- ggplot2 多个柱状图比较_15. 再论ggplot2作图的图形元素组成
- 迅雷下载链接转为普通链接
- DY-SV17F 语音模块
- php sns 源码,全网首发-LaySNS高仿资源网源码免费分享
- html css 窗口样式,简单的css样式网页
- 数字后端概念——cut metal
- P3110 [USACO14DEC]驮运Piggy Back
- C#:调用百度接口实现文字识别(准备做一个截图文字识别软件)
- (计算机体系结构)7.3 基于硬件的前瞻执行
- 宝塔安装包下载linux版本,宝塔linux面板下载
- ucGUI 储存设备绘制分析