暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

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

原创 coolmoon1202 2021-12-24
1718

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

1. 测试方案

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

2. 测试环境

2.1. 硬件配置

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

IP地址 CPU 内存 硬盘
10.30.30.11 Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz 40核 256GB 480GB SSD + 7*4TB SATA RAID5
10.30.30.12 256GB
10.30.30.13 256GB
10.30.10.27 128GB
 10.30.30.11, 10.30.30.12, 10.30.30.13服务器用于安装OBServer
 10.30.10.27服务器用于安装OBProxy、OBClient以及TPC-C与TPC-H测试工具

2.2. 软件环境

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

软件名称 软件用途 版本
CentOS 服务器操作系统 7.6.1810
OceanBase数据库开源版 用于压测的OceanBase数据库 3.1.1
OBClient OceanBase客户端,用于连接OceanBase数据库 3.1.1
gcc 用于编译构建修改后的TPC-H Tools源代码 4.8.5 20150623
JDK JAVA开发与运行环境 1.8.0_202
JDBC mysql-connector-java.jar,用于JAVA连接OceanBase 5.1.47
Ant 用于编译构建修改后的Benchmark SQL源代码 1.10.6
Python Python开发与运行环境 2.7.5
Benchmark SQL 用于执行TPC-C测试的工具 5.0
TPC-H Tools 用于执行TPC-H测试的工具 3.0.0

2.3. CentOS内核参数优化

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

2.4. OceanBase安装配置

distribute.yml完整配置如下:

user:
  username: admin
  key_file: /home/admin/.ssh/id_rsa
  port: 48539
oceanbase-ce:
  servers:
    - name: server1
      ip: 10.30.30.11
    - name: server2
      ip: 10.30.30.12
    - name: server3
      ip: 10.30.30.13
  global:
    devname: eth3
    memory_limit: 128G
    system_memory: 30G
    datafile_disk_percentage: 20
    syslog_level: INFO
    enable_syslog_wf: false
    enable_syslog_recycle: true
    max_syslog_file_count: 4
    skip_proxy_sys_private_check: true
  server1:
    mysql_port: 2881
    rpc_port: 2882
    home_path: /opt/oceanBase_data/admin
    data_dir:  /opt/oceanBase_data/data
    redo_dir:  /opt/oceanBase_data/repo
    zone: zone1
  server2:
    mysql_port: 2881
    rpc_port: 2882
    home_path: /opt/oceanBase_data/admin
    data_dir:  /opt/oceanBase_data/data
    redo_dir:  /opt/oceanBase_data/repo
    zone: zone2
  server3:
    mysql_port: 2881
    rpc_port: 2882
    home_path: /opt/oceanBase_data/admin
    data_dir:  /opt/oceanBase_data/data
    redo_dir:  /opt/oceanBase_data/repo
    zone: zone3
obproxy:
  depends:
    - oceanbase-ce
  servers: 
    - 10.30.10.27
  global:
    listen_port: 2883
    prometheus_listen_port: 2884
    home_path: /home/admin/oceanBase/proxy/
    enable_cluster_checkout: false
    skip_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. 测试数据装载完成后各表数据量情况:

表名 数据量
bmsql_customer 3000000
bmsql_district 1000
bmsql_history 3000000
bmsql_item 100000
bmsql_new_orders 900000
bmsql_order_line 30004561
bmsql_orders 3000000
bmsql_stock 10000000
bmsql_warehouse 100

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测试,等待测试完成,执行日志打印如下:

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;
  1. 生成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
  1. 测试数据装载完成后各表数据量情况:
表名 数据量
customer 1500000
lineitem 59986052
nation 25
order 15000000
part 2000000
partsupp 8000000
region 5
supplier 100000

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
  1. 执行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的测试并发数,测试结果如下:

并发数 TpmC Total 事务平均响应时间(ms)
NEW_ORDER PAYMENT ORDER_STATUS DELIVERY_BG STOCK_LEVEL
100 232859 40.4 18.1 8.7 108.2 6.4
200 294535 56.6 24.4 11.5 160.0 8.7
300 328866 70.1 30.9 13.4 237.4 8.6
400 355739 88.8 42.6 17.2 287.9 12.0
500 350429 99.3 52.8 20.2 383.4 11.8

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

4.1.2. 硬盘测试对比

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

硬盘类型 TpmC Total 事务平均响应时间(ms)
NEW_ORDER PAYMENT ORDER_STATUS DELIVERY_BG STOCK_LEVEL
SSD 232859 40.4 18.1 8.7 108.2 6.4
SATA 228226 36.7 21.1 14.9 164.2 5.7

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

4.2. TPC-H测试结果

4.2.1. 预热测试对比

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

执行语句 执行时间(s)
没有预热 有预热
Q1 3.72 1.70
Q2 0.50 0.27
Q3 2.11 1.52
Q4 0.51 0.35
Q5 1.64 1.60
Q6 0.97 0.83
Q7 2.21 1.76
Q8 1.93 1.22
Q9 3.40 3.30
Q10 0.47 0.39
Q11 0.97 0.87
Q12 1.09 1.04
Q13 0.80 0.77
Q14 0.22 0.21
Q15 0.65 0.55
Q16 0.46 0.46
Q17 1.05 1.02
Q18 1.08 1.10
Q19 1.15 1.10
Q20 1.37 1.17
Q21 2.28 2.22
Q22 0.56 0.60
总计 29.14 24.05

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

4.2.2. 硬盘测试对比

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

执行语句 执行时间(s)
没有预热 有预热
SATA SSD SATA SSD
Q1 9.88 3.72 1.64 1.70
Q2 2.88 0.50 0.48 0.27
Q3 4.73 2.11 1.14 1.52
Q4 0.48 0.51 0.30 0.35
Q5 2.52 1.64 1.60 1.60
Q6 0.89 0.97 0.78 0.83
Q7 1.70 2.21 1.67 1.76
Q8 2.57 1.93 2.15 1.22
Q9 4.61 3.40 4.48 3.30
Q10 1.34 0.47 1.12 0.39
Q11 1.05 0.97 0.84 0.87
Q12 1.08 1.09 1.01 1.04
Q13 1.00 0.80 0.84 0.77
Q14 0.62 0.22 0.24 0.21
Q15 1.32 0.65 0.58 0.55
Q16 0.63 0.46 0.49 0.46
Q17 5.05 1.05 4.01 1.02
Q18 1.01 1.08 1.00 1.10
Q19 1.36 1.15 1.43 1.10
Q20 5.76 1.37 4.75 1.17
Q21 2.28 2.22 3.72 1.70
Q22 0.66 0.56 0.60 0.60
总计 54.87 29.14 34.77 24.05

从以上测试数据可以看出,在没有预热的情况下,使用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硬盘。
最后修改时间:2021-12-26 11:56:26
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论