数据库性能测试方法讨论.docx
- 文档编号:11677492
- 上传时间:2023-03-30
- 格式:DOCX
- 页数:15
- 大小:537.74KB
数据库性能测试方法讨论.docx
《数据库性能测试方法讨论.docx》由会员分享,可在线阅读,更多相关《数据库性能测试方法讨论.docx(15页珍藏版)》请在冰豆网上搜索。
数据库性能测试方法讨论
数据库性能测试方法讨论
发布时间:
2008-5-0416:
18 作者:
陈嘉祥王治方耀等 来源:
51Testing投稿
字体:
小 中 大 |上一篇下一篇|打印 |我要投稿 |每周一问,答贴有奖
摘要:
在LOADRUNNER中使用脚本和JAVA程序进行数据库性能测试。
关键词:
LOADRUNNER,JAVA,Benchmark
一、 前言
在测试工作中经常需要对数据库进行性能测试,以对数据库进行调优,保证数据库的稳定和高效。
本文使用常用的性能测试工具LOADRUNNER,JAVA和专用数据库性能测试工具Benchmark,讨论数据库性能测试的不同方法,希望能抛砖引玉,寻找出更新更好的方法。
二、 任务引入
数据库性能测试的需求,一般来源于下面几个方面:
1、 数据库调优;
2、 数据库选型;
3、 数据库服务器选型;
4、 其他;
下面,就针对于这些常用的需求,列举几个不同的实例,共享一下测试方法。
1) LOADRUNNER应用
测试任务:
评估某项目的核心业务逻辑(数据查询、数据复用、抽取同步整合)在不同压力下的性能表现,判断系统瓶颈,得到最优系统配置参数和建议,并为数据库的试运行工作提供可靠的性能可行性依据;
数据查询性能指标:
900个用户并发,平均响应时间在3秒以内;
数据库性能测试需求:
数据库调优或服务器选型;
include"lrd.h"
Action()
{
staticLRD_INIT_INFOInitInfo={LRD_INIT_INFO_EYECAT};
staticLRD_DEFAULT_DB_VERSIONDBTypeVersion[]=
{
{LRD_DBTYPE_NONE,LRD_DBVERSION_NONE}
};
staticvoidFAR* OraEnv1;
staticvoidFAR* OraSvc1;
staticvoidFAR* OraSrv1;
staticvoidFAR* OraSes1;
staticvoidFAR* OraStm1;
unsignedlong rownum;
lrd_init(&InitInfo,DBTypeVersion);
lrd_initialize_db(LRD_DBTYPE_ORACLE,3,0);
lrd_env_init(LRD_DBTYPE_ORACLE,&OraEnv1,0,0);
lrd_ora8_handle_alloc(OraEnv1,SVCCTX,&OraSvc1,0);
lrd_ora8_handle_alloc(OraEnv1,SERVER,&OraSrv1,0);
lrd_ora8_handle_alloc(OraEnv1,SESSION,&OraSes1,0);
//连接数据库
lrd_server_attach(OraSrv1,"vmvare_192.168.1.47",-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);
//初始化连接session
lrd_ora8_attr_set_from_handle(OraSvc1,SESSION,OraSes1,0,0);
//开始连接数据库
lrd_session_begin(OraSvc1,OraSes1,1,0,0);
lrd_ora8_handle_alloc(OraEnv1,STMT,&OraStm1,0);
//设定查询语句
lrd_ora8_stmt(OraStm1,"SELECT*FROMT_TASK_ALARM_TYPEWHERETYPE_CODE=7",1,0,0);
//执行查询语句
lrd_ora8_exec(OraSvc1,OraStm1,0,0,&rownum,0,0,0,0,1);
//释放连接数据库的各种变量
lrd_handle_free(&OraStm1,0);
lrd_session_end(OraSvc1,OraSes1,0,0);
lrd_server_detach(OraSrv1,0,0);
lrd_handle_free(&OraEnv1,0);
//lrd_end(0);
return0;
}
上面的LoadRunner脚本在VirtualUserGenerator调试通过后,在Controller中打开,用900个模拟用户并发测试,即可得出性能指标(LoadRunner的操作这里就不在赘述,google一下)。
从上面的例子看出,此应用比较难懂,是LoadRunner专属的方法,而且可扩展性不强。
如果再遇到其他类型的数据库测试,协议将会是一个很大的问题。
所以,为了容易理解,可扩展性强,引出了下面的JAVA应用方法。
2) JAVA应用
测试任务:
测试待选的数据库的性能;
数据查询性能指标:
20个用户并发,每秒执行增删改语句数不少于1000条;
数据库性能测试需求:
数据库选型;
importjava.sql.*;
importjava.util.Date;
importjava.util.Properties;
publicclasstestsybase{
StringsDbDriver="com.*.*.*.*";
StringsConnStr="jdbc:
*:
*:
ip_adress:
port/sid";
privateConnectionconn=null;
privateStatementstmt=null;
ResultSetrs=null;
publictestsybase()
{
try{
Class.forName(sDbDriver);
}catch(java.lang.ClassNotFoundExceptione){
System.err.println("testdb():
"+e.getMessage());
}
}
publicvoidexecuteUpdate()
{
stmt=null;
rs=null;
try{
conn=DriverManager.getConnection(sConnStr,"*","*");
stmt=conn.createStatement();
System.out.println(newDate());
intj=0;
for(inti=0;i<10000;i++){
j=10001+i;
//追加
sql="insertintotablename(*,*,*...)"+"values('test"+i+"',*,*...)";
//更新
//sql="updatetablenamesetfield_no='testupdate',*,*...wherefiled_no="+j;
//删除
//sql="deletefromtablenamewheretablename="+j;
//查询
//sql="select*fromtablenamewheretablename="+j;
stmt.executeUpdate(sql);
//rs=stmt.executeQuery(sql);
//rs.next();
}
System.out.println(newDate());
//rs.close();
stmt.close();
conn.close();
System.out.println("Updateissecuessful!
");
}catch(SQLExceptionex){
System.err.println("executeUpdate:
"+ex.getMessage());
}
}
publicvoidexecuteSql(Stringsql)
{
stmt=null;
rs=null;
try{
conn=DriverManager.getConnection(sConnStr,"*","*");
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
rs.next();
System.out.println("Countis"+rs.getString
(1));
stmt.close();
conn.close();
//System.out.println("OK");
}catch(SQLExceptionex){
System.err.println("executeSql:
"+ex.getMessage());
}
}
publicstaticvoidmain(String[]args){
testsybasemytest=newtestsybase();
mytest.executeUpdate();
}
}
上面的java代码调试通过后,可以通过注释不同的代码段,分别测试增加、修改、删除、查询的等情况的性能,并得出时长,反算出性能。
这里说明一点,java代码即可以单独的打成jar包,放在服务器上运行,也可以直接在本地IDE运行。
如果觉得LoadRunner专业,也可以放到LoadRunner里运行,选择JavaVuser协议,这里需要注意的是,LoadRunner运行时,需要设置好RuntimeSettings中的Classpath,代码运行需要的jar包都要加到这里。
提醒一点的是,笔者使用的是LoadRunner8.0,在跑上面的代码时,使用的是Java1.4的虚拟机,高版本如1.5就不能成功运行。
从这个例子可以看出,此种应用灵活性强,任何数据库都可以做测试,只要有提供的驱动即可,如果需要,还可以扩展其他的方法。
但测试人员需至少掌握一种高级编程语言,对数据库操作也必须很熟悉,要求较高,所以又引出了下面的Benchmark的应用方法。
3) Benchmark应用
1. 引言
诚然上述的编写代码以进行数据库性能测试,对于初级测试员来说还显得有点难度,如何才能使用比较简单的方法进行测试呢?
这里将会介绍Quest公司的BenchmarkFactory,它以向导的方式一步步指引你开展测试,是一个很容易上手的工具。
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*fromA
2、查询B表
select*fromB
3、查询C表
select*fromC
4、查询D表
select*fromD
5、写入A表
insertintoA(a,b,c)values(1,2,3)
6、写入B表
insertintoB(e,f,g)values(4,5,6)
7、写入C表
insertintoC(h,i,j)values(7,8,9)
8、更新D表
updateDsetk=$BFRand(100)
9、删除A表记录
deletefromAWHEREROWNUM<=1
注:
$BFRand(100)是BenchmarkFactory提供的一个随即函数。
4. 方案建立
在BenchmarkFactory里面建立好ORACLE的profile后,新建一个Scenario
(Createacustomloadscenario)
因为有多个SQL语句,所以类型选择混合(Mix)
接着选择添加SQL语句
一一填写完成并根据模型设计赋予不同的权重(Weight)
大约设置一下并发用户数,完成后可以看到脚本区有着新增的事务列表
在右侧窗口还可以设置每次迭代的时间与并发用户数
然后再到左边脚本区,在右键菜单中选择SubmitJob,这时候BenchmarkFactory就开始自动跑起来了。
5. 测试结果
注:
红色加粗字体为值得关注部分
1、10分钟10个并发用户
RunInformation
TestRunId
12
Status
Completed
StartTime
2008-3-2512:
31
StopTime
2008-3-2512:
42
Comment
10mintest2(10users)
TimingSettings
SamplingTime
0h:
9m:
41s
Pre-SampleTime
0h:
0m:
0s
OverallResults
Userload
TestPhase
TPS
BPS
Rows
Bytes
10
1
9.75
36714.62
40097
21330928
TransactionResults-UserLoad:
10
Name
Executions
Rows
Bytes
AvgTime
deletefromAWHEREROWNUM<=1
58
0
0
0.011
updateDsetk=$BFRand(100)
12
0
0
0.094
select*fromD
5
5
120
0.002
select*fromC
4
1406
792984
0.065
select*fromB
6
34396
18195484
0.987
select*fromA
48
4290
2342340
0.021
insertintoC(h,i,j)values(7,8,9)
473
0
0
0.024
insertintoB(e,f,g)values(4,5,6)
4918
0
0
0.021
insertintoA(a,b,c)values(1,2,3)
137
0
0
0.03
可见TPS约为并发用户数,应该还有上升空间,各SQL语句执行次数比较符合理想目标。
用时方面就是B表查询需时较长(同时B表的行数也比较多),其他比较理想。
另估计是B表的查询延迟了其他的操作,导致SQL脚本总体执行次数不算太多。
2、80~100个并发虚拟用户逐渐增加的5次迭代
RunInformation
TestRunId
13
Status
Completed
StartTime
2008-3-2514:
02
StopTime
2008-3-2516:
43
Comment
1h40m80~100users
TestInformation
Name:
CustomMixLoadScenario
TestType:
MixedWorkloadDatabaseTest
TestId:
9
Version
OverallResults
Userload
TestPhase
TPS
BPS
Rows
Bytes
80
1
74.62
1908954
4138842
2213872937
85
1
53.74
4319793
9608651
5125378346
90
1
33.93
4819426
13545885
7213793995
95
1
28.85
4622486
15843582
8435056936
100
1
25.05
4469853
18239866
9712356930
TransactionResults-UserLoad:
80
Name
Executions
Rows
Bytes
AvgTime
deletefromAWHEREROWNUM<=1
753
0
0
0.039
updateDsetk=$BFRand(100)
145
0
0
0.015
select*fromD
78
78
1872
0.003
select*fromC
73
343813
193910532
1.438
select*fromB
72
3063689
1620691481
12.13
select*fromA
743
731262
399269052
0.336
insertintoC(h,i,j)values(7,8,9)
7360
0
0
0.07
insertintoB(e,f,g)values(4,5,6)
75025
0
0
0.055
insertintoA(a,b,c)values(1,2,3)
2216
0
0
0.031
这里原先构想是100分钟内并发用户从80个提升到100个,但BenchmarkFactory使用的是分开多次迭代来进行对比,于是便有上述图例(具体语句的执行情况只精选了80、90、100三次迭代)。
从数据中分析,在80个并发用户时,TPS还是约等于并发用户数,并且在20分钟内就完成了模型中的操作量。
在90个并发用户时,TPS已经大为下跌,事务处理时间大为增加,但在20至30分钟左右还是能够基本完成模型中的操作量。
至100个并发用户时,TPS就相当低下,部分事务处理时间到了一个比较难以忍受的地步,使用的时间也耗费40多分钟。
虽然因为到后面数据库表中的数据越来越多,但如此的性能还是需要优化。
从事务角度入手,文章开头所设计的模型大概在80个并发用户左右会遭遇瓶颈,如果并发用户数目不多,则该ORACLE数据库足够可以应付。
另外B表的数据量增长得很快,进行对该表查询的事务时间亦随之呈几何级别增长,必须对该表进行索引管理以提高效率。
其余两个需要经常查询的表同理。
6. 后记
此应用是针对已经投入生产使用的ORACLE数据库,通过BenchmarkFactory调用系统中常用的SQL语句来进行数据库性能测试,此乃BenchmarkFactory的冰山一角也。
读者不妨在阅读本文后,尝试BenchmarkFactory的其他测试向导,找出BenchmarkFactory的强大所在。
三、 小结
综合上面的3种应用,我们分析一下各自的优缺点和适用范围:
LoadRunner是一种工业级的性能测试工具,也得到了业界的广泛认可,但对于数据库性能测试来说,它显得有点勉为其难,同时提供的协议支持也不多,对于初中级测试人员来说,是个很大的挑战;
JAVA应用是需要自己对编码和数据库操作都比较熟悉的情况下才选择的方案,当然也可以用c和其他的开发工具,关键是能够按照自己的意愿实施性能测试。
对于初中级测试人员来说,也将是个很大的挑战;
Benchmark应用也是一种比较简单适用的数据库性能测试工具,它自身支持的数据库类型较多,如mysql,db2,sybase,oracle等,对于初学者来说,是个不错的选择;
纵观上面的应用,我们是从难到易找到各种方法进行测试的,目的就是要逐步提高我们的测试水平,提高测试效率,同时让不同层次的测试人员掌握数据库性能测试方法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 性能 测试 方法 讨论