介绍如何利用开源工具实现Oracle数据库环境中的TPC-C.对DBA、开发人员、BI实施者有一定的参考价值.
设想一下这样一种情况:
您正在负责公司的一个OLTP类型的数据库项目,面临数据库服务器选型的问题:如何选择硬件才能满足产品环境的业务要求? 这个事情是“拍脑袋” 能决定的吗?不可否认,硬件选型是一门艺术,选择合适的硬件,能给公司节省大笔的费用,选择不能满足业务需求的服务器产品,不但花了冤枉钱,还会对将来的业务产生影响。
可能大家首先会想到参考服务器的TPC-C的信息。提到TPC-C,可能很多人对此都感到既熟悉又陌生,因为经常听人说起,但是具体的问下去,能说清楚的又没有多少人,而且,从大家口中得到的还不尽相同。那么什么是TPC/TPC-C这些都代表什么意思呢?
TPC(Transaction Processing Performance Council,事务处理性能委员会)是一个非盈利性的组织,其官方站点在http://www.tpc.org 。其宗旨是为了制定商务应用基准程序(Benchmark)的标准规范,提供性能和价格度量,并管理测试结果的发布。在业界极其具有权威性。
TPC的基准程序的标准规范(Standard Specification)是对公共开放的,可以在官方站点上得到,但是TPC却不提供基准程序的代码。任何软硬件厂商或其它测试者可以根据标准规范,最优地构建自己待测的系统。为保证测试结果的客观性,被测试者(通常是厂家)必须提交给TPC一套完整的报告(Full Disclosure Report),包括被测系统的详细配置、分类价格和包含五年维护费用在内的总价格。该报告必须由TPC授权的审核员核实(TPC本身并不做审计)。
先说一下TPC-C,TPC-C是联机事务处理(on-line transaction processing , OLTP)的基准程序。TPC-C模拟一个批发商的货物管理环境。TPC-C使用三种性能和价格度量,其中性能由TPC-C吞吐率衡量,单位是tpmC。tpm是transactions per minute的简称;C指TPC中的C基准程序。它的定义是每分钟内系统处理的新订单个数。
了解了这些内容,您可能会想:我们公司的PC服务器完全是自己攒出来的,如何进行TPC-C的衡量的?也去参考TPC官方站点上的信息?不要忘了,TPC.org 上公布的测试结果都是各大厂商根据自己的系统进行了充分优化之后的出来的结果。打个比方,TPC公布的数值就好比崭新的法拉利跑车经过专业技师们的精心检查保养,然后在专用跑道上跑出来的速度值,而我们的情况可能是法拉利(甚至是夏利)要在乡村土路上行驶,可比性大打折扣。
有的朋友会想:那我们可以根据自己的情况,拿一个秒表在“乡村土路”上测试一下看看呀。这样的意义也是显而易见的,对我们的实际的环境不是更具有参考价值?不错,这也正是本文的目的:让我们利用开源(Open Source)工具来实现自己的针对Oracle数据库的TPC-C。
首先介绍一下Hammerora。从创作者对这个工具的标题描述可以看出,Hammerora是一款Oracle数据库负载测试工具。该工具可以在Oracle 8i、9i和10g等版本上使用。 当前可以用在Linux/Unix和Windows上。初步实现了跨平台。Hammerora 完全用TCL/TK写就,以GPL版权形式发布。作者是Steve Shaw。 该项目的主页在:http://sourceforge.net/projects/hammerora/ 。
Hammerora的设计原理是解析Oracle的Trace文件,并把它们转化为Oratcl程序,然后在Oracle数据库中用多个用户并发的对用户的事务进行“回放”。我们知道,Oracle的Trace文件能够翔实的记录用户对数据库的操作。这样Hammerora能够保证对用户环境的真实模拟。
Hammerora最初是用以学习的目的:期望是模拟数据库的一定数量的用户。这样一个小的基于家庭的学习开发系统就能够比较接近产品环境。这个工具已经成长为一个Oracle数据库做压力测试--从小的数据库到大的基于RAC的集群。
TCL语言已经用来提供高性能的和Oracle数据库的OCI集成,而无需重新编译生成的程序。每个生成的程序具有严格的TCL/Oratcl兼容性,并且可以在Hammerora的命令行Shell下运行。TCL的强大功能和灵活性意味着潜在的功能是无穷尽的。TCL线程包用来实现对Oracle数据库的多个并发连接。
Hammerora包含Oracle存储过程和TCL驱动脚本用来运行TPC-C基准程序。但是,我们先要构建一个同TPC-C规范相符的数据库。这样,我们需要用到Orabm。
Orabm是Geoff Ingram (High-Performance Oracle: Proven Methods for Achieving Optimum Performance and Availability一书的作者)构建的一个程序包,包含了一套SQL脚本和几个命令行程序。Orabm数据装载程序(Orabmload)构建了一组遵从TPC-C标准的数据用以测试。Orabm的程序包和源代码可以从它的主页面( http://www.linxcel.co.uk/orabm/) 得到。
Orabm的运行机制在Geoff Ingram有明确的说明,这里翻译如下:Orabm通过在每个用户指定的并发数据库会话(session) 中运行用户执行数量的数据库事务来进行工作.事务通过ORABM模式下的ORABM_SERVERSIDE_STRESS存储过程运行。 对每个并发会话来说,ORABM_SERVERSIDE_STRESS运行在orabm命令行下指定的事务数,并返回该会话在采样间隔完成时 的TPS值.要确保所有并发会话都是在采样间隔期间处理事务,TPS值仅包括事务的中间的80%,也即:初始的10%和最后的 10%将忽略掉。
更详细信息可以参考http://www.linxcel.co.uk/orabm/ 的内容.
1) 安装Oracle OCI 库
对Oracle 9i 来说,如果没有安装该组件的话,可能要重新运行runInstall,在Oracle 9i Client products树中选择"Oracle Call Interfaces" .
对Oracle 10g来说,Oracle 10 OCI 库应该是默认安装的.
2) 安装TCL
cd /usr/local/src/tcl8.4.5/unix rm -f config.cache ./configure --enable-threads --enable-shared make clean make make install3 安装TK
cd /usr/local/src/tk8.4.5/unix rm -f config.cache ./configure --with-tcl=../../tcl8.4.5/unix --enable-threads --enable-shared make clean make make install4 安装TCL Threads
cd /usr/local/src/thread2.5.2/unix rm -f config.cache sh ../configure --enable-threads --enable-shared make clean make make install5 安装Oratcl
对10g来说,要编辑配置文件,在1728 行附近, FOUND_ORACLE=0 那一行的下面添加如下部分内容:echo "checking for Oracle 10.0 style toplevel (libclient10.a)" 1> &6 echo "configure:1730: checking for Oracle 10 style toplevel(libclient10.a)"> &5 for f in $oracle_directory $oratest1 $oratest2 $oratest3 \ $oracle4 /opt/oracle /u/oracle /usr/oracle /usr/local/oracle ; do echo "$ac_t""looking for lib/libclient10.a in $f" 1>&6 if test -r "$f/lib/libclient10.a" ; then ORA="$f/lib" ORACLE_HOME=$f echo "$ac_t""setting ORA to $ORA" 1>&6 testver=10 ORA_MAJOR_VERSION=10 ORA_MINOR_VERSION=0 FOUND_ORACLE=1 break fi done export ORACLE_HOME=your_oracle_home_directory cd /usr/local/src/oratcl-4-1-branch/unix rm -f config.cache sh ../configure --with-tcl=../../tcl8.4.5/unix \ --with-oracle-directory=$ORACLE_HOME --with-oracle-version=9 ( or 10 or 8! ) \ --enable-threads --enable-sharedvi Makefile - 把所有的 -rpath 改做 -Wl,-rpath,make clean make make install sqlplus orabm/orabm @delivery_sp.sql sqlplus orabm/orabm @new_order_sp.sql sqlplus orabm/orabm @ostat_sp.sql sqlplus orabm/orabm @payment_sp.sql sqlplus orabm/orabm @slev_sp.sql
步骤 操作 命令 1 创建 ORABM用户(用TOOLS做默认表空间,
TEMP 表空间为临时表空间)sqlplus system/pwd @orabm_user 2 创建表 sqlplus system/pwd @orabm_tab 3 装载数据 $orabmload Warehouses 1 4 创建索引 sqlplus system/pwd @orabm_ind 5 分析表和索引 sqlplus system/pwd @orabm_analyze 6 创建压力测试PL/SQL 过程 sqlplus system/pwd @orabm_serverside_stress 7 把表和索引数据缓冲到SGA sqlplus system/pwd @orabm_cache
把tpc-c.tcl脚本载入Hammerora中(要查看TCL文件注意把过滤正确的文件扩展名:不是*.trc 而是*.tcl ),在该tpc-c.tcl中查找connect字符串,调整为你的数据库用户连接信息。并调整虚拟用户信息。
运行Hammerora,创建需要的用户数, 来模拟TPC-C 基准程序(注意调整好执行Hammerora程序的环境变量,最好直接用Oracle用户来执行).
Hammerora的主页 - http://hammerora.sourceforge.net/
当前的软件版本是1.15.
Geoff Ingram维护的个人站点 - http://www.linxcel.co.uk/orabm/
该站点上还有一个很有趣的工具orastress.用来进行Oracle数据库压力测试.
TPC官方站点 - http://www.tpc.org
RudolfLu的介绍 - http://www.cnoug.org/viewthread.php?tid=63
技术高手RudolfLu很早以前就曾对orabm这个工具做过介绍.
Installing Oracle 10g on RHEL AS 3 Step-by-Step - http://www.dbanotes.net/Oracle/Install-Oracle10g-RHEL3.htm