1、TPC-C测试说明
TPC-C是业界常用的一套Benchmark,由TPC委员会制定发布,用于评测数据库的联机交易处理(偏向OLTP能力)。主要涉及10张表,包含了NewOrder(新订单的生成)、Payment(订单付款)、OrderStatus(最近订单查询)、Delivery(配送)和StockLevel(库存缺货状态分析)等五类业务事务模型。TPC-C使用tpmC值(Transactions per Minute)来衡量系统最大有效吞吐量(MQTh,Max Qualified Throughput),其中Transactions以NewOrder 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协议,需要进行工具改造适配。
- 下载改造好的压测包tpcc.tar.gz,并在压测客户机中执行如下命令将其解压到tpcc目录:
mkdir tpcc tar zxvf tpcc.tar.gz -C tpcc |
- 按如下说明修改压缩包内的对应文件:
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 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
- 在压测客户端节点中执行如下命令准备压测数据:
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 |