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和vplanc​achep​lans​tat和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进行测试的步骤相关推荐

  1. 压测工具BenchmarkSQL对OceanBase开源版3.1.2性能测试调优

    作者:马顺华 从事运维管理工作多年,目前就职于六棱镜(杭州)科技有限公司,熟悉运维自动化.OceanBase部署运维.MySQL 运维以及各种云平台技术和产品.并已获得OceanBase认证OBCA. ...

  2. 实践练习六(必选):OceanBase TPC-C 测试和查看 执行计划

    实践练习六(必选):OceanBase TPC-C 测试和查看 执行计划 练习目的 本次练习目的掌握 OceanBase 的执行计划查看方法,包括 explain 命令和查看实际执行计划. 练习条件 ...

  3. 经验分享:布线测试关键步骤有哪些 ?

    我们都知道在布线完成之后都免不了布线测试这一环节,但是常常会被忽略几个布线测试关键步骤.今天小编就来说说布线测试关键步骤有哪些. 布线测试关键步骤有哪些:通断测试是基础 通断测试是测试的基础,是对线路 ...

  4. 申请支付宝授权,提现测试环境步骤

    申请支付宝授权,提现测试环境步骤: 1.登陆自己的支付宝账号: https://developers.alipay.com/dev/workspace/register?from=http%3A%2F ...

  5. 测试的步骤(功能测试)

    上文已说测试的相关概念.那么这篇文章将讲一下怎么测试. 其实测试很简单.就是模拟用户操作.做功能的戏称点点点. 比如场景法,​​​​​​就是走一遍流程. 什么叫流程呢? 第一次使用某宝买东西,注册.登 ...

  6. 常见压力测试流程步骤

    常见压力测试流程步骤: 1.明确压力测试需求.范围.场景.首先得确定测试数据库.测试用例设计等,因为压力测试对于环境的要求较高,因此基本软硬件.工具类以及测试场景的搭建都要准备好. 2.存量数据规模. ...

  7. web渗透测试基本步骤

      基本常见步骤: 一 .信息收集 要检测一个站首先应先收集信息如whois信息.网站真实IP.旁注.C段网站.服务器系统版本.容器版本.程序版本.数据库类型.二级域名.防火墙.维护者信息有哪些等等 ...

  8. 红外测试操作步骤_红外传感实验操作步骤及数据分析(无测试实图)

    红外传感实验操作步骤及数据分析(无测试实图) 1. 启动红外传感模块 红外传感模块工作实图 ( 1 ) 将 NEWlab 实验硬件平台通电并与电脑链接. ( 2 ) 将红外传感模块放置在 NEWlab ...

  9. 利用 Selenium 自动化 web 测试【步骤详解】

    简介 Selenium 是一个健壮的工具集合,跨很多平台支持针对基于 web 的应用程序的测试自动化的敏捷开发.它是一个开源的.轻量级的自动化工具,很容易集成到各种项目中,支持多种编程语言,比如 .N ...

最新文章

  1. matlab绘制圆,且求解两个圆的交点坐标
  2. Cesar竞赛平台项目中期总结
  3. Navicat和DBeaver的查询快捷键
  4. lstm结构图_神经网络——单层LSTM
  5. VTK:相互作用之ImageRegion
  6. 30分钟轻松入门Spring MVC
  7. Python 手把手实现远程控制桌面
  8. python os 常用方法_【Python 库】os 模块常用方法简介
  9. python语音信号快速傅里叶变换
  10. ggplot2 多个柱状图比较_15. 再论ggplot2作图的图形元素组成
  11. 迅雷下载链接转为普通链接
  12. DY-SV17F 语音模块
  13. php sns 源码,全网首发-LaySNS高仿资源网源码免费分享
  14. html css 窗口样式,简单的css样式网页
  15. 数字后端概念——cut metal
  16. P3110 [USACO14DEC]驮运Piggy Back
  17. C#:调用百度接口实现文字识别(准备做一个截图文字识别软件)
  18. (计算机体系结构)7.3 基于硬件的前瞻执行
  19. 宝塔安装包下载linux版本,宝塔linux面板下载
  20. ucGUI 储存设备绘制分析

热门文章

  1. linux远程连接和上传文件
  2. 程序员不要以为技术牛逼就行了,这些你得知道的职场潜规则,助你一路高升
  3. Oracle数据库管理员工作内容
  4. python学到了什么_Python这个黑科技,后悔没有早点学起来!
  5. Labview及NI-USRP驱动安装教程
  6. NI9185与NI9234硬件在NI MAX中的设置
  7. NI-6221 pwm相关函数
  8. 魔王语言C语言 使用头文件封装 链表链栈顺序队列的基本操作
  9. RayVentory更智能的软件和硬件库存
  10. 1030 Travel Plan(超级无敌详细注释+47行代码)