OceanBase 开源版V3.1.1压力测试情况

2024年 5月 7日 76.8k 0

1. 测试方案

使用 OBD 部署 OceanBase 数据库,集群部署规模为1:1:1,OBProxy、OBClient 以及 TPC-C 与 TPC-H 测试工具部署在另一台服务器上, 作为客户端的压力测试服务器,分别进行 TPC-C 与 TPC-H 测试。测试集群拓扑示意图如下:

OceanBase 开源版V3.1.1压力测试情况-1

2. 测试环境

2.1. 硬件配置

测试祼金属服务器四台,硬件配置如下:

OceanBase 开源版V3.1.1压力测试情况-2

2.2. 软件环境

安装主要软件及其版本如下:

OceanBase 开源版V3.1.1压力测试情况-3

1.进程打开文件参数优化

OceanBase 开源版V3.1.1压力测试情况-4

2.网络参数优化

OceanBase 开源版V3.1.1压力测试情况-5

2.4. OceanBase 安装配置

distribute.yml 完整配置如下:

user:username: adminkey_file: /home/admin/.ssh/id_rsaport: 48539
oceanbase-ce:servers:- name: server1ip: 10.30.30.11- name: server2ip: 10.30.30.12- name: server3ip: 10.30.30.13global:devname: eth3memory_limit: 128Gsystem_memory: 30Gdatafile_disk_percentage: 20syslog_level: INFOenable_syslog_wf: falseenable_syslog_recycle: truemax_syslog_file_count: 4skip_proxy_sys_private_check: trueserver1:mysql_port: 2881rpc_port: 2882home_path: /opt/oceanBase_data/admindata_dir:  /opt/oceanBase_data/dataredo_dir:  /opt/oceanBase_data/repozone: zone1server2:mysql_port: 2881rpc_port: 2882home_path: /opt/oceanBase_data/admindata_dir:  /opt/oceanBase_data/dataredo_dir:  /opt/oceanBase_data/repozone: zone2server3:mysql_port: 2881rpc_port: 2882home_path: /opt/oceanBase_data/admindata_dir:  /opt/oceanBase_data/dataredo_dir:  /opt/oceanBase_data/repozone: zone3
obproxy:depends:- oceanbase-ceservers: 
    - 10.30.10.27global:listen_port: 2883prometheus_listen_port: 2884home_path: /home/admin/oceanBase/proxy/enable_cluster_checkout: falseskip_proxy_sys_private_check: true

3. 测试方法

3.1. TPC-C 测试方法

3.1.1. 测试准备

  1. 先安装 JDK、Ant、Benchmark SQL、OceanBase 数据库与 OBClient ,安装方法与步骤按照官方 OceanBase 数据库 TPC-C 测试文档执行。
  2. 修改 BenchMarkSQL5 部分源码,修改及编译构建方法按照官方 OceanBase 数据库 TPC-C 测试文档执行。
  3. 创建租户 tpcc_tenant 用于测试,并分配租户资源,使用 root@sys 用户登录并执行 SQL 如下:
create resource unit tpcc_unit max_cpu 26,
max_memory = '32G',
max_iops 128,
max_disk_size '100G',
max_session_num 64,
MIN_CPU = 26,
MIN_MEMORY = '32G',
MIN_IOPS = 128;

create resource pool tpcc_pool unit = 'tpcc_unit',
unit_num = 1,
zone_list =('zone1','zone2','zone3');

create tenant tpcc_tenant resource_pool_list =('tpcc_pool'),
charset = utf8mb4,
replica_num = 3,
zone_list('zone1','zone2','zone3'),
primary_zone = RANDOM,
locality = 'F@zone1,F@zone2,F@zone3' set ob_compatibility_mode = mysql;

ALTER TENANT tpcc_tenant SET VARIABLES ob_tcp_invited_nodes = '%';

grant file on *.* to root@tpcc_tenant;
  1. 对 OBP、OceanBase 系统配置与变量参数进行优化,优化方法按照官方 OceanBase 数据库 TPC-C 测试文档执行。由于导数据阶段与执行测试阶段优化参数存在部分冲突,此时暂不优化执行测试阶段的优化参数。
  2. 修改配置文件 prop.oceanbase,配置 warehouse 数量为100,装载数据并行度 loadWorkers 设置为34,TPC-C 压测并行度 terminals 设置为300,完整配置如下:
db=oceanbase
driver=com.mysql.jdbc.Driver
conn=jdbc:mysql://10.30.10.27:2883/tpcc?rewriteBatchedStatements=true&allowMultiQueries=true&useLocalSessionState=true&useUnicode=true&characterEncoding=utf-8&socketTimeout=30000000
user=root@tpcc_tenant
password=
warehouses=100
loadWorkers=34
terminals=300
database=tpcc
runTxnsPerTerminal=0
runMins=5
limitTxnsPerMin=0
terminalWarehouseFixed=true
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4
resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
osCollectorScript=./misc/os_collector_linux.py
osCollectorInterval=1

6 生成并装载 TPC-C 测试数据到 OceanBase 数据库,数据装载完成后进行数据合并,装载数据与合并方法按照官方 OceanBase 数据库 TPC-C 测试文档执行。

7. 测试数据装载完成后各表数据量情况:

OceanBase 开源版V3.1.1压力测试情况-6

3.1.2. 执行测试

  1. 按执行测试阶段优化参数对 OceanBase 系统配置参数进行优化,使用 root@sys 用户登录并执行 SQL 语句如下,一些系统配置参数修改后需要重启 OceanBase 集群生效。
##如果导入阶段开启了限速需要关闭
alter system set writing_throttling_trigger_percentage=100 tenant=tpcc_tenant;
alter system set writing_throttling_maximum_duration='1h';
alter system set memstore_limit_percentage = 80; 
alter system set freeze_trigger_percentage = 30; 
alter system set large_query_threshold = '200s';
alter system set trx_try_wait_lock_timeout = '0ms';
alter system set cpu_quota_concurrency = 4;
alter system set minor_warm_up_duration_time = 0;
alter system set minor_freeze_times=500;
alter system set minor_compact_trigger=3;
alter system set sys_bkgd_io_high_percentage = 90;
alter system set sys_bkgd_io_low_percentage = 70;
alter system set minor_merge_concurrency =20;
alter system set builtin_db_data_verify_cycle = 0;
alter system set trace_log_slow_query_watermark = '10s';
alter system set gts_refresh_interval='500us'; 
alter system set server_permanent_offline_time='36000s';
alter system set weak_read_version_refresh_interval=0;
alter system set  _ob_get_gts_ahead_interval = '5ms';
##为频繁空查的宏块建立bloomfilter并缓存,减少磁盘IO和CPU消耗,提升写入性能
alter system set bf_cache_priority = 10;
alter system set user_block_cache_priority=5;
alter system set merge_stat_sampling_ratio = 0;
##close sql audit
alter system set enable_sql_audit=false;
##调整日志级别及保存个数
alter system set syslog_level='PERF';
alter system set max_syslog_file_count=100;
alter system set enable_syslog_recycle='True';
alter system set ob_enable_batched_multi_statement=true tenant=tpcc_tenant;
alter system set _cache_wash_interval = '1m';
alter system set plan_cache_evict_interval = '30s';
alter system set enable_one_phase_commit=false;
alter system set enable_monotonic_weak_read = false;

2 使用 ./runBenchmark.sh prop.oceanbase 命令执行 TPC-C 测试,等待测试完成,执行日志打印如下:

OceanBase 开源版V3.1.1压力测试情况-7

3.2. TPC-H 测试方法

3.2.1. 测试准备

1.先安装 gcc、python、TPC-H Tools,安装方法与步骤按照官方 OceanBase 数据库 TPC-H 测试文档执行,使用 TPC-C 测试已经创建好的 tpcc_tenant 测试租户用于 TPC-H 测试。

2.对 OceanBase 系统配置与变量参数进行优化,优化方法按照官方 OceanBase 数据库TPC-H测试文档执行。

3.修改 TPC-H Tools 部分源码,修改及编译构建方法按照官方 OceanBase 数据库 TPC-H 测试文档执行。其中 db13 语句有语法错误,需要修改如下才能正常执行:

select  /*+    parallel(96) */
  c_count,
  count(*) as custdist
from
  (
    select
      c_custkey,
      count(o_orderkey) as c_count   #修改点from
      customer left outer join orders on
        c_custkey = o_custkey
        and o_comment not like '%special%packages%'group by
      c_custkey
  ) c_orders
group by
  c_count
order by
  custdist desc,
  c_count desc;

4.生成 10GB 的 TPC-H 测试数据并装载测试数据到 OceanBase 数据库,数据装载完成后进行数据合并,装载数据与合并方法按照官方 OceanBase 数据库 TPC-H 测试文档执行。load.py 修改如下:

#/usr/bin/evn python
#-*- encoding:utf-8 -*-
import os
import sys
import time
import commands
hostname='10.30.30.11'
port='2881'
tenant='tpcc_tenant'
user='root'
password=''
data_path='/data1/tpch10'
db_name='tpch'
#创建表
cmd_str='obclient -h%s -P%s -u%s@%s < create_tpch_mysql_table_part.sql'%(hostname,port,user,tenant)
result = commands.getstatusoutput(cmd_str)
print result
cmd_str='obclient -h%s -P%s -u%s@%s -D%s -e "show tables;" '%(hostname,port,user,tenant,db_name)
result = commands.getstatusoutput(cmd_str)
print result
cmd_str=""" obclient -h%s -P%s -u%s@%s -c  -D%s -e "load data /*+ parallel(80) */ infile '%s/customer.tbl' into table customer fields terminated by '|';" """ %(hostname,port,user,tenant,db_name,data_path)
result = commands.getstatusoutput(cmd_str)
print result
cmd_str=""" obclient -h%s -P%s -u%s@%s -c  -D%s -e "load data /*+ parallel(80) */ infile '%s/lineitem.tbl' into table lineitem fields terminated by '|';" """ %(hostname,port,user,tenant,db_name,data_path)
result = commands.getstatusoutput(cmd_str)
print result
cmd_str=""" obclient -h%s -P%s -u%s@%s -c -D%s -e "load data /*+ parallel(80) */ infile '%s/nation.tbl' into table nation fields terminated by '|';" """ %(hostname,port,user,tenant,db_name,data_path)
result = commands.getstatusoutput(cmd_str)
print result
cmd_str=""" obclient -h%s -P%s -u%s@%s -c  -D%s -e "load data /*+ parallel(80) */ infile '%s/orders.tbl' into table orders fields terminated by '|';" """ %(hostname,port,user,tenant,db_name,data_path)
result = commands.getstatusoutput(cmd_str)
print result
cmd_str=""" obclient -h%s -P%s -u%s@%s -D%s -e "load data /*+ parallel(80) */ infile '%s/partsupp.tbl' into table partsupp fields terminated by '|';" """ %(hostname,port,user,tenant,db_name,data_path)
result = commands.getstatusoutput(cmd_str)
print result
cmd_str=""" obclient -h%s -P%s -u%s@%s -c  -D%s -e "load data /*+ parallel(80) */ infile '%s/part.tbl' into table part fields terminated by '|';" """ %(hostname,port,user,tenant,db_name,data_path)
result = commands.getstatusoutput(cmd_str)
print result
cmd_str=""" obclient -h%s -P%s -u%s@%s -c  -D%s -e "load data /*+ parallel(80) */ infile '%s/region.tbl' into table region fields terminated by '|';" """ %(hostname,port,user,tenant,db_name,data_path)
result = commands.getstatusoutput(cmd_str)
print result
cmd_str=""" obclient -h%s -P%s -u%s@%s -c  -D%s -e "load data /*+ parallel(80) */ infile '%s/supplier.tbl' into table supplier fields terminated by '|';" """ %(hostname,port,user,tenant,db_name,data_path)
result = commands.getstatusoutput(cmd_str)
print result

5.测试数据装载完成后各表数据量情况:

OceanBase 开源版V3.1.1压力测试情况-8

3.2.2. 执行测试

1.在 TPC-H Tools 的 dbgen/queries 目录下,创建 tpch.sh 测试脚本,编写内容如下:

#!/bin/bash
TPCH_TEST="obclient -h10.30.10.27 -P2883 -uroot@tpcc_tenant  -Dtpch -c"
#warmup预热
for i in {1..22}
do
    sql1="source db${i}.sql"echo $sql1| $TPCH_TEST >db${i}.log  || ret=1
done
#正式执行
for i in {1..22}
do
    starttime=`date +%s%N`
    echo `date  '+[%Y-%m-%d %H:%M:%S]'` "BEGIN Q${i}"
    sql1="source db${i}.sql"echo $sql1| $TPCH_TEST >db${i}.log  || ret=1
    stoptime=`date +%s%N`
    costtime=`echo $stoptime $starttime | awk '{printf "%0.2f\n", ($1 - $2) / 1000000000}'`
    echo `date  '+[%Y-%m-%d %H:%M:%S]'` "END,COST ${costtime}s"
done

2.执行 sh tpch.sh 命令,该脚本在预热执行期间没有终端日志打印输出,可通过 dbgen/queries 目录下的 db*.log 文件是否生成来确定预热执行的进度。正式执行的终端日志打印如下:

[2021-12-15 11:15:55] BEGIN Q1
[2021-12-15 11:15:56] END,COST 1.70s
[2021-12-15 11:15:56] BEGIN Q2
[2021-12-15 11:15:57] END,COST 0.27s
[2021-12-15 11:15:57] BEGIN Q3
[2021-12-15 11:15:58] END,COST 1.52s
[2021-12-15 11:15:58] BEGIN Q4
[2021-12-15 11:15:58] END,COST 0.35s
[2021-12-15 11:15:58] BEGIN Q5
[2021-12-15 11:16:00] END,COST 1.60s
[2021-12-15 11:16:00] BEGIN Q6
[2021-12-15 11:16:01] END,COST 0.83s
[2021-12-15 11:16:01] BEGIN Q7
[2021-12-15 11:16:03] END,COST 1.76s
[2021-12-15 11:16:03] BEGIN Q8
[2021-12-15 11:16:04] END,COST 1.22s
[2021-12-15 11:16:04] BEGIN Q9
[2021-12-15 11:16:07] END,COST 3.30s
[2021-12-15 11:16:07] BEGIN Q10
[2021-12-15 11:16:08] END,COST 0.39s
[2021-12-15 11:16:08] BEGIN Q11
[2021-12-15 11:16:08] END,COST 0.87s
[2021-12-15 11:16:08] BEGIN Q12
[2021-12-15 11:16:09] END,COST 1.04s
[2021-12-15 11:16:09] BEGIN Q13
[2021-12-15 11:16:10] END,COST 0.77s
[2021-12-15 11:16:10] BEGIN Q14
[2021-12-15 11:16:10] END,COST 0.21s
[2021-12-15 11:16:10] BEGIN Q15
[2021-12-15 11:16:11] END,COST 0.55s
[2021-12-15 11:16:11] BEGIN Q16
[2021-12-15 11:16:11] END,COST 0.46s
[2021-12-15 11:16:11] BEGIN Q17
[2021-12-15 11:16:13] END,COST 1.02s
[2021-12-15 11:16:13] BEGIN Q18
[2021-12-15 11:16:14] END,COST 1.10s
[2021-12-15 11:16:14] BEGIN Q19
[2021-12-15 11:16:15] END,COST 1.10s
[2021-12-15 11:16:15] BEGIN Q20
[2021-12-15 11:16:16] END,COST 1.17s
[2021-12-15 11:16:16] BEGIN Q21
[2021-12-15 11:16:18] END,COST 2.22s
[2021-12-15 11:16:18] BEGIN Q22
[2021-12-15 11:16:19] END,COST 0.60s

4. 测试结果

4.1. TPC-C 测试结果

4.1.1. 并发测试对比

使用 SSD 硬盘做为 OceanBase 数据存储,通过修改 prop.oceanbase 的 terminals 参数来修改 TPC-C 的测试并发数,测试结果如下:

OceanBase 开源版V3.1.1压力测试情况-9

OceanBase 开源版V3.1.1压力测试情况-10

从以上测试数据可以看出,随着测试并发数的增加,由于 OceanBase 服务器集群资源负荷增大,事务平均响应时间会逐步增加,但总的 TpmC 会提高;但当测试并发数达到或超过临界点后,OceanBase服务器集群资源超出最大负载,总的 TpmC 反而会下降。

4.1.2. 硬盘测试对比

分别使用 SSD 硬盘、SATA 硬盘做为 OceanBase 数据存储,100并发测试结果如下:

OceanBase 开源版V3.1.1压力测试情况-11

从上表测试数据可以看出,使用 SSD 硬盘,无论是总的 TpmC 还是事务的平均响应时间,比起使用 SATA 盘都会有一定的优势,但优势并不是很明显。应该是因为 OceanBase 使用 LSM Tree 存储架构提高了内存的使用效率,降低了硬盘读写损耗对系统的影响。

4.2. TPC-H测试结果

4.2.1. 预热测试对比

使用 SSD 硬盘做为 OceanBase 数据存储,修改 tpch.sh 脚本,注释掉预热部分代码,在装载数据成功后第一次执行即为非预热执行,第二次执行脚本则为预热后执行,测试结果如下:

OceanBase 开源版V3.1.1压力测试情况-12

OceanBase 开源版V3.1.1压力测试情况-13

从上表测试数据可以看出,预热后TPC-H的测试SQL语句执行性能会有一定的提升,是因为SQL在解析与执行时命中了执行计划缓存与部分数据缓存所致。

4.2.2. 硬盘测试对比

分别使用SSD硬盘、SATA硬盘做为OceanBase数据存储,执行测试结果如下:

OceanBase 开源版V3.1.1压力测试情况-14

OceanBase 开源版V3.1.1压力测试情况-15

OceanBase 开源版V3.1.1压力测试情况-16

从以上测试数据可以看出,在没有预热的情况下,使用 SSD 硬盘比使用 SATA 硬盘有较大的性能提升;但在有预热的情况下,使用 SSD 硬盘比使用 SATA 硬盘的性能提升则不是很明显。应该是因为在预热情况下 TPC-H 的测试 SQL 语句在执行时命中了部分数据缓存,减少了从硬盘读取数据所带来的损耗。

4.3. 测试小结

  • 通过本次对 OceanBase 开源版 V3.1.1 三节点集群的压力测试,可以得出以下结论:按照 TPC-C 标准进行测试,最高可达 355739TpmC ,最快可以在 24.05 秒完成整个 TPC-H 的测试 SQL 执行,说明了 OceanBase 开源版 V3.1.1 在 OLTP 与 OLAP 场景下都有不俗的表现,并可通过横向扩展满足大部分海量数据高并发业务场景的性能需求。虽然本次测试 TpmC 比官方网站上公布的性能测试数据要差一些,但可能在服务器硬件配置以及操作系统内核参数优化方面有一定差异,无法直接进行类比。
  • 通过 SSD 硬盘与 SATA 硬盘对比测试发现,在 TPC-C 测试下提升效果并不明显,而在 TPC-H 测试下,提升效果会好一些。所以如果以 OLTP 业务为主的话,可以使用 SATA 硬盘来节省成本,在预算充足的情况下,当然还是首选 SSD 硬盘。

OceanBase 社区版入门到实战教程直播正在进行中~

快和小伙伴一起进群交流学习吧~

加入直播群方式一:

钉钉群号 3582 5151

加入直播群方式二:

扫码下方二维码加入

OceanBase 开源版V3.1.1压力测试情况-17

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论