人大金仓-在 TPCE(tpsE)测试框架方面的实践和突破

        人大金仓在为某项目认证时,需要提供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 配置的绝对大小不能反映典型的客户端配置。 下表显示了两个基准之间的其他一些主要区别。

人大金仓-在 TPCE(tpsE)测试框架方面的实践和突破

客户从 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

  1. 修改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

     

    测试环境准备

  1. Python
  2. 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

  测试步骤

        测试安装包

  1. pg数据库或kingbase数据库服务程序
  2. dbt5测试程序

包括dbt5,egen,storedprocs

​​​​​​​​​​​​​​        安装测试程序

  1. 安装pg或kingbase数据库服务程序

        $tar -zxvf pg12.tar.gz

        $tar -zxvf kingbase########.tar.gz

      2.准备dbt5测试程序安装包

       kingbase版本使用以下的安装包:

        $tar -zxvf osdldbt-dbt5_kb.tar.gz

       3.编译安装

        按照第4章步骤编译安装​​​​​​​

        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

        8.测试结果

        运行完dbt5-run-workload

        结果如下显示:

人大金仓-在 TPCE(tpsE)测试框架方面的实践和突破

 

        其中29.9为tpse。

        性能指标(tpsE, transactions per second E)和性价比(美元/tpsE)。

可以看到,tpse还是比较低的。由此我们对dbt5测试工具做了以下改造:

先看一下dbt5运行拓扑图:

人大金仓-在 TPCE(tpsE)测试框架方面的实践和突破

 

        在使用dbt5测试的过程中,我们发现了一些问题,最主要的问题就是当增加user数时(并发处理能力),dbt5的股票交易所模块程序会有大量的进程被创建出来,且持续增加,这样一来就会将当前服务器环境的文件句柄和进程资源等计算资源快速消耗光,导致无法继续测试下去。

        由此,通过阅读和理解dbt5原程序的代码逻辑,分析了出现以上问题的起因,故对dbt5原架构做了以下的优化,过程如下:

优化前:

人大金仓-在 TPCE(tpsE)测试框架方面的实践和突破

 

tpsE将以Trade_result的统计流程为主要统计数据。

优化后:

人大金仓-在 TPCE(tpsE)测试框架方面的实践和突破

 

        这样一来,消除了在做TPCE测试时增加user数,(通过增加user数,增加并发处理能力),出现的大量进程和线程产生的情况,测试的结果tpsE也有了显著提升。

tpsE由改造前100以内,提高改造后的2000左右。(服务器的CPU核数为64 核)。

 其他参考:

数据库TPCE benchmark测试工具_luke_wang的专栏-CSDN博客_tpce测试

【更多人大金仓数据库信息, 详见 https://help.kingbase.com.cn/ 】
 

上一篇:也许你不知道,这样入门Python会更快


下一篇:【Mac MySql异常】Bug 1045 (28000): Access denied to user 'root'@'localhost' on MAC OSX (use password: no) (ERROR 1045 (28000):