数据库性能测试方法讨论_第1页
数据库性能测试方法讨论_第2页
数据库性能测试方法讨论_第3页
数据库性能测试方法讨论_第4页
数据库性能测试方法讨论_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库性能测试方法讨论发布时间: 2008-5-04 16:18 作者: 陈嘉祥 王治 方耀等 来源: 51Testing 投稿字体: 小 中 大 | 上一篇 下一篇 | 打印 | 我要投稿 | 每周一问,答贴有奖 摘要:在 LOADRUNNER 中使用脚本和 JAVA 程序进行 数据库性能测试。关键词:LOADRUNNER,JAVA, Benchmark一、 前言在测试工作中经常需要对数据库进行性能测试,以对数据库进行调优,保证数据库的稳定和高效。本文使用常用的性能测试工具 LOADRUNNER,JAVA 和专用数据库性能测试工具Benchmark,讨论数据库性能测试的不同方法,希望能抛砖引玉,寻找出更新更好的方法。二、 任务引入数据库性能测试的需求,一般来源于下面几个方面:1、 数据库调优;2、 数据库选型;3、 数据库服务器选型;4、 其他;下面,就针对于这些常用的需求,列举几个不同的实例,共享一下测试方法。1) LOADRUNNER 应用测试任务:评估某项目的核心业务逻辑(数据查询、数据复用、抽取同步整合)在不同压力下的性能表现,判断系统瓶颈,得到最优系统配置参数和建议,并为数据库的试运行工作提供可靠的性能可行性依据;数据查询性能指标:900 个用户并发,平均响应时间在 3 秒以内;数据库性能测试需求:数据库调优或服务器选型;include “lrd.h“Action()static LRD_INIT_INFO InitInfo = LRD_INIT_INFO_EYECAT;static LRD_DEFAULT_DB_VERSION DBTypeVersion =LRD_DBTYPE_NONE, LRD_DBVERSION_NONE;static void FAR * OraEnv1;static void FAR * OraSvc1;static void FAR * OraSrv1;static void FAR * OraSes1;static void FAR * OraStm1;unsigned long rownum;lrd_init(lrd_initialize_db(LRD_DBTYPE_ORACLE,3, 0);lrd_env_init(LRD_DBTYPE_ORACLE, lrd_ora8_handle_alloc(OraEnv1, SVCCTX, lrd_ora8_handle_alloc(OraEnv1, SERVER, lrd_ora8_handle_alloc(OraEnv1, SESSION, /连接数据库lrd_server_attach(OraSrv1, “vmvare_7“, -1, 0, 0);lrd_ora8_attr_set_from_handle(OraSvc1, SERVER, OraSrv1, 0, 0);/设定数据库密码lrd_ora8_attr_set(OraSes1, USERNAME, “username“, -1, 0);lrd_ora8_attr_set(OraSes1, PASSWORD, “password“, -1, 0);/初始化连接 sessionlrd_ora8_attr_set_from_handle(OraSvc1, SESSION, OraSes1, 0, 0);/开始连接数据库lrd_session_begin(OraSvc1, OraSes1, 1, 0, 0);lrd_ora8_handle_alloc(OraEnv1, STMT, /设定查询语句lrd_ora8_stmt(OraStm1, “SELECT * FROM T_TASK_ALARM_TYPE WHERE TYPE_CODE=7“, 1, 0, 0);/执行查询语句lrd_ora8_exec(OraSvc1, OraStm1, 0, 0,/释放连接数据库的各种变量lrd_handle_free(lrd_session_end(OraSvc1, OraSes1, 0, 0);lrd_server_detach(OraSrv1, 0, 0);lrd_handle_free(/lrd_end(0);return 0;上面的 LoadRunner 脚本在 Virtual User Generator 调试通过后,在 Controller中打开,用 900 个模拟用户并发测试,即可得出性能指标(LoadRunner 的操作这里就不在赘述,google 一下)。从上面的例子看出,此应用比较难懂,是 LoadRunner 专属的方法,而且可扩展性不强。如果再遇到其他类型的数据库测试,协议将会是一个很大的问题。所以,为了容易理解,可扩展性强,引出了下面的 JAVA 应用方法。2) JAVA 应用测试任务:测试待选的数据库的性能;数据查询性能指标:20 个用户并发,每秒执行增删改语句数不少于 1000 条;数据库性能测试需求:数据库选型;import java.sql.*;import java.util.Date;import java.util.Properties;public class testsybase String sDbDriver = “com.*.*.*.*“;String sConnStr = “jdbc:*:*:ip_adress:port/sid“;private Connection conn = null;private Statement stmt = null;ResultSet rs = null;public testsybase()try Class.forName(sDbDriver); catch (java.lang.ClassNotFoundException e) System.err.println(“testdb():“ + e.getMessage();public void executeUpdate()stmt = null;rs = null;try conn = DriverManager.getConnection(sConnStr, “*“, “*“);stmt = conn.createStatement();System.out.println(new Date();int j=0;for(int i=0;i10000;i+)j=10001+i;/追加sql=“insert into tablename(*, *, *.) “+“values(test“+i+“,*,*.)“;/更新/sql=“update tablename set field_no=testupdate,*,*. where filed_no=“+j;/删除/sql=“delete from tablename where tablename=“+j;/查询/sql=“select * from tablename where tablename=“+j;stmt.executeUpdate(sql);/rs=stmt.executeQuery(sql);/rs.next();System.out.println(new Date();/rs.close();stmt.close();conn.close();System.out.println(“Update is secuessful!“); catch (SQLException ex) System.err.println(“executeUpdate:“ + ex.getMessage();public void executeSql(String sql)stmt = null;rs = null;try conn = DriverManager.getConnection(sConnStr, “*“, “*“);stmt = conn.createStatement();rs=stmt.executeQuery(sql);rs.next();System.out.println(“Count is “+rs.getString(1);stmt.close();conn.close();/System.out.println(“OK“); catch (SQLException ex) System.err.println(“executeSql:“ + ex.getMessage();public static void main(String args) testsybase mytest = new testsybase();mytest.executeUpdate();上面的 java 代码调试通过后,可以通过注释不同的代码段,分别测试增加、修改、删除、查询的等情况的性能,并得出时长,反算出性能。这里说明一点,java 代码即可以单独的打成 jar 包,放在服务器上运行,也可以直接在本地 IDE 运行。如果觉得 LoadRunner 专业,也可以放到 LoadRunner 里运行,选择Java Vuser 协议,这里需要注意的是,LoadRunner 运行时,需要设置好 Runtime Settings 中的 Classpath,代码运行需要的 jar 包都要加到这里。提醒一点的是,笔者使用的是 LoadRunner 8.0,在跑上面的代码时,使用的是 Java 1.4 的虚拟机,高版本如 1.5就不能成功运行。从这个例子可以看出,此种应用灵活性强,任何数据库都可以做测试,只要有提供的驱动即可,如果需要,还可以扩展其他的方法。但测试人员需至少掌握一种高级编程语言,对数据库操作也必须很熟悉,要求较高,所以又引出了下面的 Benchmark 的应用方法。3) Benchmark 应用1. 引言诚然上述的编写代码以进行数据库性能测试,对于初级测试员来说还显得有点难度,如何才能使用比较简单的方法进行测试呢?这里将会介绍 Quest 公司的 Benchmark Factory,它以向导的方式一步步指引你开展测试,是一个很容易上手的工具。2. 模型设计假设有一个正在使用的数据库,库中有相当数量的数据,作为支撑某个系统用。每天上班时间中大概有 500 人次的 A 表写入记录,也大约有 500 人次的 A 表查询;系统的程序每天大概会往数据库的 B 表写进 50000 条记录,以及 5000 条 C 表记录,还有 1000 条 A 表记录,删除 500 条 A 表记录,更新 100条 D 表记录;然后管理员要对 B 表、C 表及 D 表进行 50 人次查询。根据二八原则,百分之八十的工作在百分之二十的时间内完成,即上述列出的工作量,其 80%将在 1.6 小时完成。另外作为对比,本次测试再对该模型进行缩减处理,即在二八原则的基础上,工作量及时间都缩减为原来的 10%。最终的结果是 10 分钟内,对数据库进行的查询操作有 40 条 A 表查询、BCD 表各 4 条查询;写操作有 120 条 A 表记录、4000 条 B 表记录、400 条 C 表记录;更新操作有 8 条 D 表记录;删除操作有 40条 A 表记录。3. 语句构建相关的 SQL 语句构建如下:1、查询 A 表select * from A2、查询 B 表select * from B3、查询 C 表select * from C4、查询 D 表select * from D5、写入 A 表insert into A (a,b,c) values (1,2,3)6、写入 B 表insert into B(e,f,g) values (4,5,6)7、写入 C 表insert into C(h,i,j) values (7,8,9)8、更新 D 表update D set k = $BFRand(100)9、删除 A 表记录delete from A WHERE ROWNUM=1注:$BFRand(100)是 Benchmark Factory 提供的一个随即函数。4. 方案建立在 Benchmark Factory 里面建立好 ORACLE 的 profile 后,新建一个 Scenario(Create a custom load scenario)因为有多个 SQL 语句,所以类型选择混合(Mix)接着选择添加 SQL 语句 一一填写完成并根据模型设计赋予不同的权重(Weight)大约设置一下并发用户数,完成后可以看到脚本区有着新增的事务列表 在右侧窗口还可以设置每次迭代的时间与并发用户数 然后再到左边脚本区,在右键菜单中选择 Submit Job,这时候 Benchmark Factory 就开始自动跑起来了。 5. 测试结果注:红色加粗字体为值得关注部分1、10 分钟 10 个并发用户Run InformationTest Run Id 12 Status CompletedStart Time2008-3-25 12:31Stop Time 2008-3-25 12:42Comment 10min test2(10users)Timing SettingsSampling Time 0h:9m:41sPre-Sample Time 0h:0m:0sOverall ResultsUserloadTest Phase TPS BPS Rows Bytes10 1 9.75 36714.62 40097 21330928Transaction Results - User Load: 10NameExecutionsRows BytesAvg Timedelete from A WHERE ROWNUM=1 58 0 0 0.011update D set k = $BFRand(100) 12 0 0 0.094select * from D 5 5 120 0.002select * from C 4 1406 792984 0.065select * from B 63439618195484 0.987select * from A 48 4290 2342340 0.021insert into C(h,i,j) values (7,8,9) 473 0 0 0.024insert into B(e,f,g) values (4,5,6) 4918 0 0 0.021insert into A (a,b,c) values (1,2,3) 137 0 0 0.03可见 TPS 约为并发用户数,应该还有上升空间,各 SQL 语句执行次数比较符合理想目标。用时方面就是B 表查询需时较长(同时 B 表的行数也比较多),其他比较理想。另估计是 B 表的查询延迟了其他的操作,导致 SQL 脚本总体执行次数不算太多。2、80100 个并发虚拟用户逐渐增加的 5 次迭代Run InformationTest Run Id 13StatusCompletedStart Time 2008-3-25 14:02Stop Time2008-3-25 16:43Comment 1h40m 80100usersTest InformationName: Custom Mix Load ScenarioTest Type: Mixed Workload Database TestTest Id: 9 VersionOverall ResultsUserloadTest Phase TPS BPS Rows Bytes80 1 74.62 1908954 4138842 221387293785 1 53.74 4319793 9608651 512537834690 1 33.93 4819426 13545885 721379399595 1 28.85 4622486 15843582 8435056936100 1 25.05 4469853 18239866 9712356930Transaction Results - User Load: 80NameExecutions Rows BytesAvg Timedelete from A WHERE ROWNUM=1 753 0 00.039update D set k = $BFRand(100) 145 0 00.015select * from D 78 78 18720.003select * from C 733438131939105321.438select * from B 723063689162069148112.13select * from A 7437312623992690520.336insert into C(h,i,j) values (7,8,9) 7360 0 00.07insert into B(e,f,g) values (4,5,6) 75025 0 00.055insert into A (a,b,c) values (1,2,3) 2216 0 00.031这里原先构想是 100 分钟内并发用户从 80 个提升到 100 个,但 Benchmark Factory 使用的是分开多次迭代来进行对比,于是便有上述图例(具体语句的执行情况只精选了 80、90 、100 三次迭代)。从数据中分析,在 80 个并发用户时,TPS 还是约等于并发用户数,并且在 20 分钟内就完成了模型中的操作量。在 90 个并发用户时,TPS 已经大为下跌,事务处理时间大为增加,但在 20 至 30 分钟左右还是能够基本完成模型中的操作量

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论