金仓数据库性能测试方案

1、TPC-C测试说明

TPC-C是业界常用的一套Benchmark,由TPC委员会制定发布,用于评测数据库的联机交易处理(偏向OLTP能力)。主要涉及10张表,包含了NewOrder(新订单的生成)、Payment(订单付款)、OrderStatus(最近订单查询)、Delivery(配送)和StockLevel(库存缺货状态分析)等五类业务事务模型。TPC-C使用tpmC值(Transactions per Minute)来衡量系统最大有效吞吐量(MQThMax Qualified Throughput),其中TransactionsNewOrder Transaction为准,即最终衡量单位为每分钟处理的新订单数。

2、测试设计

2.1测试数据量

针对普通实例性能测试,TPC-C测试结果主要基于1000 Warehouse,其中主要的表数据量如下:

      • bmsql_order_line 3000万行
      • bmsql_stock 1亿行
      • bmsql_customer 10万行
      • bmsql_history 900万行
      • bmsql_oorder 3000万行

2.2测试所用实例规格

节点数:2

CPU: 2*鲲鹏920

内存:256G DDR4内存

硬盘:2*480G SSD

操作系统:麒麟V10 SP1

2.3测试数据库配置参数

人大金仓参数

MySQL参数

2.4监控指标

TPS:queries per seconds 每秒查询数量

QPS:Transaction per seconds 每秒事务数

cpu使用率:一般情况下上限为85%。

内存占用率:一般情况下上限为85%。

磁盘I/O: 1)监控磁盘实际I/O是否已接近最大值,接近则有问题;

2)I/O队列长度一直不为0,说明磁盘I/O有问题。

网络带宽(本次不做考虑):监控实际的网络流量,与网络带宽做对比,如果实际网络流量与网络带宽比较接近,则网络存在瓶颈,需要优化。(注意:实际中的百兆带宽是Mbps,但是我们技术中衡量的带宽的单位是MBps,1MBps=8Mbps【1Byte=8bit】,所以实际带宽=100/8=12.5)

慢查询:监控系统在运行时,所执行的所有sql语句,检查这些sql是否慢(设置一个时长,超过这个时长就是慢查询)

缓存命中率:监控业务执行过程中sql查询时的缓存命中率(查询语句读取缓存的次数占总查询次数的的比例,如果缓存命中率过低,需要优化代码和sql查询语句)

数据库连接池:监控数据库连接池的使用率(如果数据库连接池被占满,如果此时有新的sql语句要执行,只能排队等待,等待连接池中的连接被释放【也就是之前的sql语句执行完成】)如果监控发现数据库连接池的使用率过高,甚至是经尝出现排队的情况,需要调优。

锁:监控测试过程中是否有死锁出现,如果出现,需要进行优化。

3、测试方法

步骤1:准备测试机

用来测试的服务器主要包含压测客户端机器和测试服务器两类,当前我们具有的环境是两台物理机,单节点压测时可以利用其中一个节点作为压测客户端(测试集群能力时需要另行寻找一台机器作为压测客户端使用)。

步骤2:准备压测所用数据库实例

a.安装数据库软件,详细操作步骤请参见《功能性测试方案》。

b.创建一个待压测的数据库(本测试中数据库名为tpcc)。

步骤3:准备压测数据

MySQL测试

1、准备压测工具

说明

本文使用开源的BenchmarkSQL 5.0进行TPC-C测试。

BenchmarkSQL默认不支持MySQL协议,需要进行工具改造适配。

  1. 下载改造好的压测包tpcc.tar.gz,并在压测客户机中执行如下命令将其解压到tpcc目录:

mkdir tpcc

tar zxvf tpcc.tar.gz -C tpcc

  1. 按如下说明修改压缩包内的对应文件:

src/client/jTPCC.java(增加一个MySQL的type)

src/client/jTPCCConnection.java(支持MySQL的语法,加一个别名)

src/LoadData/LoadData.java(关闭loader数据时的大事务机制)

src/LoadData/LoadDataWorker.java(关闭loader数据时的大事务机制)

run/funcs.sh(脚本增加一个MySQL的type)

run/runDatabaseBuild.sh(去掉不必要的阶段)

run/runBenchmark.sh(调整默认jvm参数)

run/runLoader.sh(调整默认jvm参数)

run/sql.common/foreignKeys.sql

run/sql.common/indexCreates.sql (注释掉全部主键创建,只留2个索引创建,MySQL默认在建表时直接创建索引)

run/sql.common/indexDrops.sql(注释全部主键删除)

run/sql.common/tableCreates.sql(添加主键和拆分键,需要指定拆分键)

2、准备压测配置

a.在压测客户端节点中执行如下命令,在tpcc/run目录下创建props.mysql文件:

// --------- env config --------- //

db=mysql

driver=com.mysql.jdbc.Driver

conn=jdbc:mysql://drdsxxxx:3306/tpcc?

useSSL=false&useServerPrepStmts=false&useConfigs=maxPerformance&rewriteBatchedStatements=true

user=tpcc

password=tpcc

// warehouse 数量

warehouses=1000

// 导入数据的并发数,每100并发预计产生2万TPS,可以结合目标TPS能力调整并发

// runLoader.sh的jvm内存,100并发默认为4 GB,500并发建议设置为16 GB

loadWorkers=100

// TPC-C压测并发数

terminals=100

// 压测时间,单位分钟

runMins=20

// ---------- default config ------- //

//To run specified transactions per terminal- runMins must equal zero

runTxnsPerTerminal=0

//Number of total transactions per minute

limitTxnsPerMin=0

//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

执行SQL工具建表

./runSQL.sh props.dm sqlTableCreates

装载数据:

./runLoader.sh props.dm numWarehouses 1000

装载数据完毕后查看下表内数据:

select count(*) from BENCHMARKSQL.bmsql_config      union all

select count(*) from BENCHMARKSQL.bmsql_warehouse   union all

select count(*) from BENCHMARKSQL.bmsql_district    union all

select count(*) from BENCHMARKSQL.bmsql_customer    union all

select count(*) from BENCHMARKSQL.bmsql_history     union all

select count(*) from BENCHMARKSQL.bmsql_oorder      union all

select count(*) from BENCHMARKSQL.bmsql_new_order   union all

select count(*) from BENCHMARKSQL.bmsql_order_line  union all

select count(*) from BENCHMARKSQL.bmsql_stock       union all

select count(*) from BENCHMARKSQL.bmsql_item;

金仓测试

(1)准备工作

     vim /etc/sysctl.conf

     kernel.sem= 50100 64128000 50100 1280

     vm.dirty_ratio=40

     vm.diryt_background_ratio=10

vim /etc/security/limits.conf

*   soft   nofile 655360

*   hard   nofile 655360

*   soft   nproc  655360

*   hard   nproc  655360

*   soft   memlock    unlimited

*   hard   memlock    unlimited

*   soft   core   unlimited

*   hard   core   unlimited

sysctl -p

创建tpcc测试库:

ksql -Usystem -p 54321 test

create database tpcc;

(2)配置kingbasepool

     /home/kingbase/下创建KingbasePool,将kingbasepool.zip解压到KingbasePool目录下,并配置。

cd /home/kingbase/KingbasePool/pool

mkdir config

mkdir log

cp /home/kingbase/KingbasePool/pool/share/doc/kingbasepool/kingbasepool.ini config

vim kingbasepool.ini

[database]

test = host=localhost port=54321 dbname=tpcc user=system password=123456 client_encoding=UNICODE datestyle=ISO connect_query='SELECT 1'

[kingbasepool]

logfile = /home/kingbase/KingbasePool/pool/log/kingbasepool.log

pidfile = /home/kingbase/KingbasePool/pool/kingbasepool.pid

listen_addr = *

listen_port = 64660

auth_type = plain

auth_file = /home/kingbase/KingbasePool/pool/log/userlist.txt

admin_users = system

stats_users = system

vi /home/kingbase/KingbasePool/pool/log/userlist.txt

"system" "123456"

(3)启动kingbasepool

cp /home/kingbase/KingbaseES/Interface/jdbc/kingbase8-8.6.0.jar /home/kingbase/KingbasePool/pool

vi .bash_profile

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/kingbase/KingbasePool/pool/bin:/home/kingbase/KingbasePool/pool/lib

source .bash_profile

KingbasePool/pool/bin/kingbasepool -d KingbasePool/pool/config/kingbasepool.ini

(4)装载数据

修改benchmarksql下,连接金仓数据库的配置

cd /home/kingbase

unzip benchmarksql5.0_kingbase.zip

cd benchmarksql5.0_kingbase

mv benchmarksql5.0_kingbase /home/kingbase/KingbasePool/pool

cd /home/kingbase/KingbasePool/pool/benchmarksql5.0_kingbase/run

cp props.fb props.kb

vim props.kb

db=kingbase

driver=com.kingbase8.Driver

conn=jdbc:kingbase8://localhost:54321/tpcc

user=system

password=123456

warehouses=1000

loadWorkers=100

terminals=100

runTxnsPerTerminal=0

runMins=20

limitTxnsPerMin=0

准备压测数据

vi runDatabaseBuildkb.sh

date

/home/kingbase/KingbasePool/pool/benchmarksql5.0_kingbase/run/runDatabaseBuild.sh props.kb

date

nohup ./runDatabaseBuildkb.sh > runDatabaseBuildkb.log 2>&1 &

装载数据完毕后查看下表内数据:

ksql -Usystem  tpcc

select count(*) from bmsql_config union all

select count(*) from bmsql_warehouse union all

select count(*) from bmsql_district union all

select count(*) from bmsql_customer union all

select count(*) from bmsql_history union all

select count(*) from bmsql_oorder union all

select count(*) from bmsql_new_order union all

select count(*) from bmsql_order_line union all

select count(*) from bmsql_stock union all

select count(*) from bmsql_item;

(5)数据预热

ksql -Usystem tpcc登录数据库。

CREATE EXTENSION sys_prewarm;

select sys_prewarm (' bmsql_customer');

select sys_prewarm ('bmsql_history');

select sys_prewarm ('bmsql_district');

select sys_prewarm (' bmsql_item');

select sys_prewarm ('bmsql_new_order');

select sys_prewarm ('bmsql_oorder');

select sys_prewarm ('bmsql_order_line');

select sys_prewarm ('bmsql_stock');

select sys_prewarm ('bmsql_warehouse');

说明

导入压测数据时,需要关注warehouses(仓库数)和loadWorkers(并发数)。

TPC-C压测时,需要关注terminals(并发数)和runMins(运行时间)。

通过人大金仓数据库监控软件进行各项指标监控及操作系统性能监控并做好记录。

步骤4:压测执行(MySQL、人大金仓分别执行)

MySQL

  1. 在压测客户端节点中执行如下命令准备压测数据:

cd tpcc/run

vi runDatabaseBuildmysql.sh

date

全路径/run/runDatabaseBuild.sh props.mysql

date

nohup ./runDatabaseBuildmysql.sh > runDatabaseBuildmysql.log 2>&1 &

说明 默认按照100并发导入,总共5亿多记录,整体导入时间在小时级别,建议通过nohup推到后台运行,避免ssh命令行断开导致导入中断。

b.执行如下命令运行TPC-C测试:

cd tpcc/run

vi runBenchmarkmysql.sh

date

全路径/run/runBenchmark.sh props.mysql

date

nohup ./runBenchmarkmysql.sh > runBenchmarkmysql.log 2>&1 &

金仓

执行如下命令运行TPC-C测试:

cd benchmarksql5.0_kingbase/run

vi runBenchmarkkb.sh

date

/home/kingbase/KingbasePool/pool/benchmarksql5.0_kingbase/run/runBenchmark.sh props.kb

date

nohup ./runBenchmarkkb.sh > runBenchmarkkb.log 2>&1 &

100并发:

500并发:

1000并发:

运行之后给出人大金仓与MySQL数据库在相同服务器配置下的对比结果:

warehouse

并发量

运行时间

金仓Tpmc

MySQLTpmc

1000

100

20min

1000

500

20min

1000

1000

20min

说明

tpmC值即为对应压测场景下的结果。

查看TPCC基准测试一致性验证语句:

(Select w_id,w_ytd from BENCHMARKSQL.bmsql_warehouse) except(select d_w_id,sum(d_ytd) from BENCHMARKSQL.bmsql_district group by d_w_id);

(Select d_w_id, d_id, D_NEXT_O_ID - 1 from BENCHMARKSQL.bmsql_district)  except (select o_w_id, o_d_id, max(o_id) from BENCHMARKSQL.bmsql_oorder group by  o_w_id, o_d_id);

(Select d_w_id, d_id, D_NEXT_O_ID - 1 from BENCHMARKSQL.bmsql_district)  except (select no_w_id, no_d_id, max(no_o_id) from BENCHMARKSQL.bmsql_new_order group by no_w_id, no_d_id);

select * from (select (count(no_o_id)-(max(no_o_id)-min(no_o_id)+1)) as diff from BENCHMARKSQL.bmsql_new_order group by no_w_id, no_d_id) where diff != 0;

(select o_w_id, o_d_id, sum(o_ol_cnt) from BENCHMARKSQL.bmsql_oorder  group by o_w_id, o_d_id) except (select ol_w_id, ol_d_id, count(ol_o_id) from BENCHMARKSQL.bmsql_order_line group by ol_w_id, ol_d_id);

(select d_w_id, sum(d_ytd) from BENCHMARKSQL.bmsql_district group by d_w_id)  except(Select w_id, w_ytd from BENCHMARKSQL.bmsql_warehouse);

如果结果全为0行,则说明tpcc库是一致的,否则说明此库在运行过程中数据出现混乱。

步骤5:清理压测数据

执行如下命令清理压测数据:

MySQL

cd tpcc/run

./runDatabaseDestroy.sh props.mysql

金仓

cd benchmarksql5.0_kingbase/run

./runDatabaseDestroy.sh props.kb

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值