人大金仓在为某项目认证时,需要提供TPCE测试框架和测试的结果可以达到比较高的测试数据。为此我们利用现有的开源技术和技术改造,成功的完成了认证并拿到资质证书。
具体介绍如下:
首先介绍TPCE相关和编译相关的知识。
TPC-E和测试工具dbt-5介绍
什么是 TPC-E
TPC 测试基准 E (下文称 TPC-E) 是由事务处理性能委员会 (下称 TPC) 开发的一个新的用于测试 OLTP 负载的测试基准(基准于 2007 年被审核通过)。 TPC-E 通过模拟了证券交易公司的业务来测试数据库的 OLTP 性能。TPC-E 测试的重点是数据库,更多关注的是这个数据库处理来自证券公司和其客户账号的相关交易。 尽管在 TPC-E 测试基准之下的业务模型是一个证券公司的业务,但是数据库的表结构和数据分布,以及交易本身和实现规则都是尽最大程度的测试当下的 OLTP 数据库系统。
为什么我们需要一个新的 OLTP 测试基准?
IBM 在 1992 年 9 月份发布了它的第一个 TPC-C 的测试结果。 14 年之后(本文写于 2007 年),由 TPC 成员公司发布的最新 TPC-C 的测试结果,相比于第一次的结果而言,也有着五个数量级的差距。 考虑到在过去的 14 年里,工业界发生了非常大的变化。 我们也不能再使用一个为 1990 年代技术开发的测试基准来测试如今的系统。
TPC 在数年之前也意识到了这件事:TPC-C 作为一个最重要的测试 OLTP 的测试基准已经到了垂暮之年。 随后,一个由超过半数 TPC 会员组成的开发委员会提出了一个新的测试框架的提案。从那时开始,TPC-E 的开发委员会已经花费了极多的时间提升,完善和提出 TPC-E 的原型。
TPC-E 和 TPC-C 究竟有什么区别?
一个关键的区别是,TPC-E 基准配置将更像一个真实客户会实际使用的配置。 这意味着基准测试中使用的软件和硬件配置应与客户端使用的软件相似或相同。 TPC-C 配置的绝对大小不能反映典型的客户端配置。 下表显示了两个基准之间的其他一些主要区别。
客户从 TPC-E 能得到什么好处?
某种程度上,引入新的 OLTP 基准可以降低现有 TPC-C 结果的价值。 但是,TPC-E 的引入并不意味着可以立即更换 TPC-C,并且不应该立即取代 TPC-C 的结果。 TPC-C 能够取代 TPC-A 和 TPC-B 是因为 TPC-C 在经过数年而不不仅仅是数月的时间中证明了自己的价值。
当供应商使用新的基准测试时,他们将使用自己的产品来确定新和具体有象征意义的 “机会”。 对于新的基准测试来说,这是典型的做法。新的基准只有在被不断使用的过程中才能成熟起来成为一个最终的产品。使用新的基准确定的产品改进很有可能对客户环境产生积极的影响。 另一方面,针对 TPC-C 的改进对客户生产环境的发挥的作用可能也要小得多。同时,针对 TPC-C 进行优化的空间也已经不多了(毕竟已经 从 2007 年算起已经 14 年了;如果从翻译本文的时间算起,已经快 30 年了)。
DBT-5
DBT-5 can be used for the OLTP load test, it simulated a Broker's Firm's activities. DBT-5 is a very useful TPC-ETM benchmark test specification of TPC.
The GIT link:
git://osdldbt.git.sourceforge.net/gitroot/osdldbt/dbt5
或
https://git.code.sf.net/p/osdldbt/dbt5 osdldbt-dbt5
表介绍:
窗体顶端 分类 窗体底端 |
表名 |
中文表名 |
前缀 |
客户类 |
ACCOUNT_PERMISSION |
客户账目许可表 |
AP_ |
CUSTOMER |
客户信息表 |
C_ |
|
CUSTOMER_ACCOUNT |
客户账目表 |
CA_ |
|
CUSTOMER_TAXRATE |
客户税率表 |
CX_ |
|
HOLDING |
客户股票持有表 |
H_ |
|
HOLDING_HISTORY |
客户股票持有历史表 |
HH_ |
|
HOLDING_SUMMARY |
客户股票持有总表 |
HS_ |
|
WATCH_ITEM |
客户观察证券列表 |
WI_ |
|
WATCH_LIST |
客户观察证券表 |
WL_ |
|
经纪人类 |
BROKER |
经纪人表 |
B_ |
CASH_TRANSACTION |
现金交易表 |
CT_ |
|
CHARGE |
交易费用表 |
CH_ |
|
COMMISSION_RATE |
佣金率表 |
CR_ |
|
SETTLEMENT |
结算表 |
SE_ |
|
TRADE |
交易表 |
T_ |
|
TRADE_HISTORY |
交易历史表 |
TH_ |
|
TRADE_REQUEST |
交易请求表 |
TR_ |
|
TRADE_TYPE |
交易类型表 |
TT_ |
|
交易所类 |
COMPANY |
公司表 |
CO_ |
COMPANY_COMPETITOR |
公司竞争者表 |
CP_ |
|
DAILY_MARKET |
日常市场统计表 |
DM_ |
|
EXCHANGE |
交易所表 |
EX_ |
|
FINANCIAL |
财政表 |
FI_ |
|
INDUSTRY |
行业表 |
IN_ |
|
LAST_TRADE |
最后交易表 |
LT_ |
|
NEWS_ITEM |
新闻项表 |
NI_ |
|
NEWS_XREF |
公司新闻参照表 |
NX_ |
|
SECTOR |
公司领域表 |
SC_ |
|
SECURITY |
证券表 |
S_ |
|
因素类 |
ADDRESS |
地址表 |
AD_ |
STATUS_TYPE |
交易状态表 |
ST_ |
|
TAXRATE |
税率表 |
TX_ |
|
ZIP_CODE |
邮政编码表 |
ZC_ |
TPC-E标准中定义的事务有12种,每个事务对应数据库管理系统中的一个或多个带输入和输出参数的存储过程,单个存储过程叫做一个事务帧。事务的种类有如下几种:
(1) Broker-Volume:经纪人交易统计事务,包含1个事务帧;
(2) Customer-Position:客户价值统计事务,包含3个事务帧;
(3) Market-Watch:市场观察事务,包含1个事务帧;
(4) Security-Detail:证券信息事务,包含1个事务帧;
(5) Trade-Lookup:交易查询事务,包含4个事务帧;
(6) Trade-Order:交易执行事务,包含6个事务帧;
(7) Trade-Status:交易状态事务,包含1个事务帧;
(8)Trade-Update:交易修正事务,包含3个事务帧;
(9) Market-Feed:市场跟踪事务,包含1个事务帧,该事务由TradeOrder事务引起;
(10)Trade-Result:交易结果更新事务,包含6个事务帧,该事务由TradeOrder事务引起;
(11)Data-Maintenance:数据维护事务,包含1个事务帧,每60秒执行一次;
(12)Trade-Cleanup:交易清理事务,包含1个事务帧,测试开始时执行一次,不强制使用。
前8种事务由证券公司执行,第9-10号事务由交易所执行,最后两种事务属于数据库维护事务,与客户操作无关。
编译准备
准备源代码包和库
源代码包下载
$git clone https://git.code.sf.net/p/osdldbt/dbt5 osdldbt-dbt5
编译环境准备
Linux操作系统,可支持x86和arm架构平台
Cmake
gcc
编译
编译dbt-5
- 修改CMakeList.txt
增加pg_config查找路径
FIND_PROGRAM(PG_CONFIG sys_config)
为
FIND_PROGRAM(PG_CONFIG sys_config /home/km/kes)
/home/km/kes为kes某个版本的安装目录
2.运行编译
$make
3.安装
$make install DESTDIR=/home/km/dbt5
/home/km/dbt5为安装dbt-5的目录
4.编译EGen
进入egen/prj
$ cd egen/prj
$make -f Makefile.pgsql
显示:
在egen/bin下有两个可执行程序:
EGenLoader
EGenValidate
5.编译 storedprocs functions
进入storedprocs/pgsql/c
$ make
$ make install
运行make install显示:
/bin/mkdir -p '/home/km/pg12/share/postgresql/contrib'
/bin/mkdir -p '/home/km/pg12/lib/postgresql'
/usr/bin/install -c -m 644 broker_volume.sql customer_position.sql market_feed.sql market_watch.sql security_detail.sql trade_lookup.sql trade_order.sql trade_result.sql trade_status.sql trade_update.sql data_maintenance.sql trade_cleanup.sql '/home/km/pg12/share/postgresql/contrib/'
/usr/bin/install -c -m 755 broker_volume.so customer_position.so market_feed.so market_watch.so security_detail.so trade_lookup.so trade_order.so trade_result.so trade_status.so trade_update.so data_maintenance.so trade_cleanup.so '/home/km/pg12/lib/postgresql/'
测试程序
测试程序
1、dbt5测试主要程序
安装完成后在安装目录的bin下有如下文件:
-rwxr-xr-x 1 km mqm 1619147 10月 27 09:58 BrokerageHouseMain
-rwxr-xr-x 1 km mqm 9923 10月 27 01:41 dbt5-generate-report
-rwxr-xr-x 1 km mqm 416 10月 27 01:41 dbt5-get-os-info
-rwxr-xr-x 1 km mqm 612 10月 27 01:41 dbt5-pgsql-backup-db
-rwxr-xr-x 1 km mqm 3490 10月 27 01:41 dbt5-pgsql-build-db 建库和输入测试数据
-rwxr-xr-x 1 km mqm 2717 10月 27 01:41 dbt5-pgsql-check-db
-rwxr-xr-x 1 km mqm 1374 10月 27 01:41 dbt5-pgsql-create-db
-rwxr-xr-x 1 km mqm 30291 10月 27 01:41 dbt5-pgsql-create-indexes
-rwxr-xr-x 1 km mqm 22206 10月 27 01:41 dbt5-pgsql-create-tables
-rwxr-xr-x 1 km mqm 22590 10月 27 01:41 dbt5-pgsql-db-plans
-rwxr-xr-x 1 km mqm 3824 10月 27 01:41 dbt5-pgsql-db-stat
-rwxr-xr-x 1 km mqm 521 10月 27 01:41 dbt5-pgsql-drop-db
-rwxr-xr-x 1 km mqm 2753 10月 27 01:41 dbt5-pgsql-drop-tables
-rwxr-xr-x 1 km mqm 1736 10月 27 01:41 dbt5-pgsql-load-stored-procs
-rwxr-xr-x 1 km mqm 618 10月 27 01:41 dbt5-pgsql-restore-db
-rwxr-xr-x 1 km mqm 1061 10月 27 01:41 dbt5-pgsql-start-db 启动数据库
-rwxr-xr-x 1 km mqm 470 10月 27 01:41 dbt5-pgsql-stop-db 停止数据库
-rwxr-xr-x 1 km mqm 4024 10月 27 01:41 dbt5-plot-transaction-rate
-rwxr-xr-x 1 km mqm 5094 10月 27 01:41 dbt5-post-process 生成报告
-rwxr-xr-x 1 km mqm 19029 10月 27 01:41 dbt5-run-workload 运行测试
-rwxr-xr-x 1 km mqm 2509 10月 27 01:41 dbt5-sysstats
-rwxr-xr-x 1 km mqm 3339405 10月 27 09:58 DriverMain
-rwxr-xr-x 1 km mqm 2098150 10月 27 09:59 MarketExchangeMain
-rwxr-xr-x 1 km mqm 4511380 10月 27 09:59 TestTxn
其中dbt5打头的是shell和python脚本,
BrokerageHouseMain 券商服务器程序
DriverMain 客户交易程序
MarketExchangeMain 交易所服务程序
TestTxn
2、egen程序
EGen is a TPC provided software package that accompanies TPC-E and it is
designed to facilitate its implementation. The main components of EGen are EGen-Loader, EGenDriver and EGenTxnHarness. EGenLoader is used to generate data
for the database; it has two built-in loaders, one that generates output flat files,and another that loads a Microsoft SQL Server database; EGenLoader can be ex-tended to support direct loading of other databases. We extended EGenLoader tosupport PostgreSQL, as we will show in the next section. EGenDriver facilitatesthe implementation of a driver; it has the following components: EGenDriverCE(Customer Emulator), EGenDriverMEE (Market Exchange Emulator) and EGen-DriverDM (Data Maintenance). EGenTxnHarness is a TPC provided C++ class
that defines the transaction logic, such class is not allowed to be changed by thesponsors. This logic is used together with the transactions defined on the database server.
目录信息如下:
bin
EGenLoader
EGenValidate
flat_out
flat_in
测试环境准备
- Python
- R语言环境
版本:R version 3.0.1 (2013-05-16) -- "Good Sport"
编译方式:
1)将源代码包解压。
tar xvfz R-3.01.tar.gz
2)编译安装
$./configure --prefix=/usr/local/R/R-3 --with-gnu-ld --with-cairo --with-x --enable-R-shlib
$make
$make install
2.R语言rpy2 插件
版本:2.1.8
将源代码解压
$tar -zxvf rpy2-2.1.8.tar.gz
3.代码修改
修改 rpy2-2.1.8版本中
rpy/rinterface/rinterface.c中1415行中
extern void Rf_PrintWarnings(void);
Rf_PrintWarnings(); /* show any warning messages */
注释这两行
/*
extern void Rf_PrintWarnings(void);
Rf_PrintWarnings(); */ /* show any warning messages */
4.编译安装
$ python setup.py build --r-home /usr/local/R/R-3/lib64/R/ install
建库程序介绍
建库命令:dbt5-pgsql-build-db
Usage:
./dbt5-pgsql-build-db [option]
./dbt5-pgsql-build-db -h
Options:
-b <integer>
Beginning customer ordinal position 开始客户序号位置
-c <integer>
Number of customers for this instance 数据库实例有多少个客户
-d <dbname>
PGDATABASE name PG数据库名
-h
this help
-i <path>
Path to EGen EGen编译安装的路径
-l <port>
database port 数据库监听端口
-p <database_parameters>
PostgreSQL database parameters
-r
Drop existing database before building a new database
-s <scale factor>
Scale factor (customers per 1 trtps)
-t <integer>
Number of customers (total) 客户总数
-u
Use tablespaces
-w <days>
Initial trade days (business days) to populate
使用指定端口进行测试的命令:
dbt5-pgsql-build-db -l 54322 -c 1000 -t 1000 -s 500 -w 1 -p "-p 54322"
运行程序介绍
dbt5-run-workload
usage: run_workload.sh
-c <number of customers> 数据库中的客户数(在册的客户数)
-d <duration of test> 测试时间
-u <number of users> 同时在线的用户数(客户数)
other options:
-a <pgsql> 使用pg
-b <database parameters> 传输给数据库的参数列表
-f <scale factor. (default 500)> 比例因子?
-h <database host name. (default localhost)> 数据库地址
-i <egen_path> egen程序路径或者使用环境变量EGENDIR指定
-l <pacing delay. (default 0)>
-n <database name. (default dbt5)> 数据库名称
-o <result output dir> 结果输出目录
-p <database port number. (default 5432)> 数据库端口
-q <event1,[event2,...]> (Linux perf events)
-r <random number seed, invalidates test>
-s <delay between starting threads in milliseconds (default 1000)>
-t <customers total> 客户总数
-w <initial trade days. (default 300)> 初始交易天数
-x (oprofile)
-y (readprofile)
-z <comment describing this test run>
Example: sh run_workload.sh -c 1000 -t 300 -u 3 -i 10
Test will be run for 300 seconds with 3 users, on a 1000 customers database with 10 initial trade days, and seed 5
使用指定端口进行测试的命令:
dbt5-run-workload -a pgsql -c 500 -t 500 -d 120 -u 1 -f 500 -w 300 -p 54322 -n dbt5test -o ./results
测试步骤
测试安装包
- pg数据库或kingbase数据库服务程序
- dbt5测试程序
包括dbt5,egen,storedprocs
安装测试程序
- 安装pg或kingbase数据库服务程序
$tar -zxvf pg12.tar.gz
$tar -zxvf kingbase########.tar.gz
2.准备dbt5测试程序安装包
kingbase版本使用以下的安装包:
$tar -zxvf osdldbt-dbt5_kb.tar.gz
3.编译安装
按照第4章步骤编译安装
$mkdir dbt5test
5.在测试目录下创建setp文件
setp文件内容如下:
export EGENDIR=/home/km/osdldbt-dbt5/egen egen代码目录
export DBT5DBNAME=dbt5test 数据库实例名称
export DBT5PGDATA=/home/km/dbt5test/data 数据库数据目录
export DBT5TSDIR=/home/km/dbt5test dbt5测试目录,为当前目录
export PG_HOME=$HOME/pg12 数据库安装目录
export DBT5_HOME=$HOME/dbt5 dbt5测试程序安装目录
export R_HOME=/usr/local/R/R-3/lib64/R R语言安装目录
export PATH=.:$R_HOME/bin:$PG_HOME/bin:$DBT5_HOME/bin:$PATH
PATH路径包括:
R语言,数据库安装目录bin,dbt5安装目录bin
export 、LD_LIBRARY_PATH=$PG_HOME/lib:$R_HOME/lib:$LD_LIBRARY_PATH
动态库路径包括:数据库安装目录lib,R语言lib
执行setp
$ . ./setp
6.建库创建数据
使用默认端口和默认配置:
$dbt5-pgsql-build-db -c 1000 -t 1000 -s 5 -w 1
使用指定端口54322和数据库实例名称
$ dbt5-pgsql-build-db -l 54322 -c 1000 -t 1000 -s 500 -w 1 -p " -d ${DBT5DBNAME} -p 54322"
7.运行测试程序
使用默认端口和默认配置:
$ dbt5-run-workload -a pgsql -c 1000 -t 1000 -d 120 -u 1 -f 500 -w 300 -n dbt5test -o ./results
使用指定端口:
$ dbt5-run-workload -b " -d ${DBT5DBNAME} -p 54322" -a pgsql -c 500 -t 500 -d 120 -u 1 -f 500 -w 300 -p 54322 -n dbt5test -o ./results
运行完dbt5-run-workload
结果如下显示:
其中29.9为tpse。
性能指标(tpsE, transactions per second E)和性价比(美元/tpsE)。
可以看到,tpse还是比较低的。由此我们对dbt5测试工具做了以下改造:
先看一下dbt5运行拓扑图:
在使用dbt5测试的过程中,我们发现了一些问题,最主要的问题就是当增加user数时(并发处理能力),dbt5的股票交易所模块程序会有大量的进程被创建出来,且持续增加,这样一来就会将当前服务器环境的文件句柄和进程资源等计算资源快速消耗光,导致无法继续测试下去。
由此,通过阅读和理解dbt5原程序的代码逻辑,分析了出现以上问题的起因,故对dbt5原架构做了以下的优化,过程如下:
优化前:
tpsE将以Trade_result的统计流程为主要统计数据。
优化后:
这样一来,消除了在做TPCE测试时增加user数,(通过增加user数,增加并发处理能力),出现的大量进程和线程产生的情况,测试的结果tpsE也有了显著提升。
tpsE由改造前100以内,提高改造后的2000左右。(服务器的CPU核数为64 核)。
其他参考:
数据库TPCE benchmark测试工具_luke_wang的专栏-CSDN博客_tpce测试
【更多人大金仓数据库信息, 详见 https://help.kingbase.com.cn/ 】