附件具有截图
本次测试使用的loadrunner 版本为8.1,oracle数据库版本为10.2.0.1,各版本的测试方法基本是一样的。这里提供loadrunner 8.1,10000个web用户的license:
AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB
还有golba-1000:AEACFSJI-YASEKJJKEAHJD-BCLBR
1、 打开loadrunner界面,选择创建脚本
2、 选择Oracle (2—tier)协议,
3、 录制的程序选择sqlplus的路径,如:E:\oracle\product\10.2.0\db_1\BIN\sqlplus.exe
注意我们录制到的操作时Action
4、我们输入用户和密码,并向Test表中插入一条数据,然后提交以后输入quit退出。
5、LoadRunner会自动的给我们生成脚本,这个脚本默认是采用c语言编写的,我们可以对代码根据自己的要求进行一些修改,比如我们希望每次执行的SQL语句都是不同的,或者我们需要让一个用户重复去执行N条记录以后才退出。
6、下面我们对代码进行一下修改,让用户登录sqlplus之后重复执行20次insert操作之后commit;我们每次插入的值有循环次数决定,从1到20;部分脚本如下:
Action()
{
int j=0;
int i=0;
char word[50];
lrd_init(&InitInfo, DBTypeVersion);
lrd_initialize_db(LRD_DBTYPE_ORACLE, 2, 0);
lrd_env_init(LRD_DBTYPE_ORACLE, &OraEnv1, 0, 0);
lrd_ora8_handle_alloc(OraEnv1, SERVER, &OraSrv1, 0);
lrd_ora8_handle_alloc(OraEnv1, SVCCTX, &OraSvc1, 0);
lrd_ora8_handle_alloc(OraEnv1, SESSION, &OraSes1, 0);
lrd_ora8_handle_alloc(OraEnv1, SESSION, &OraSes2, 0);
lr_think_time(12);
lrd_server_attach(OraSrv1, "", -1, 0, 0);
lrd_ora8_attr_set_from_handle(OraSvc1, SERVER, OraSrv1, 0, 0);
lrd_ora8_attr_set(OraSes1, USERNAME, "scott", -1, 0);
lrd_ora8_attr_set(OraSes1, PASSWORD, lr_decrypt("4a8a04d62971759a946f"), -1, 0);
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 USER FROM DUAL", 1, 32, 0);
lrd_ora8_exec(OraSvc1, OraStm1, 0, 0, &uliRowsProcessed, 0, 0, 0, 0,
0);
lrd_ora8_bind_col(OraStm1, &OraDef1, 1, &USER_D1, 0, 0);
lrd_ora8_fetch(OraStm1, -1, 1, &uliFetchedRows, PrintRow2, 2, 0, 0);
GRID8(2);
lrd_handle_free(&OraStm1, 0);
lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm2, 0);
lrd_ora8_stmt(OraStm2, "BEGIN DBMS_OUTPUT.DISABLE; END;", 1, 32, 0);
lrd_ora8_exec(OraSvc1, OraStm2, 1, 0, &uliRowsProcessed, 0, 0, 0, 0,
0);
lrd_handle_free(&OraStm2, 0);
lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm3, 0);
lrd_ora8_stmt(OraStm3, "SELECT ATTRIBUTE,SCOPE,NUMERIC_VALUE,CHAR_VALUE,DATE_VALUE FROM "
"SYSTEM.PRODUCT_PRIVS WHERE (UPPER('SQL*Plus') LIKE UPPER"
"(PRODUCT)) AND (UPPER(USER) LIKE USERID)", 1, 32, 0);
lrd_ora8_exec(OraSvc1, OraStm3, 0, 0, &uliRowsProcessed, 0, 0, 0, 0,
0);
lrd_ora8_bind_col(OraStm3, &OraDef2, 1, &ATTRIBUTE_D2, 0, 0);
lrd_ora8_bind_col(OraStm3, &OraDef3, 2, &SCOPE_D3, 0, 0);
lrd_ora8_bind_col(OraStm3, &OraDef4, 3, &NUMERIC_VALUE_D4, 0, 0);
lrd_ora8_bind_col(OraStm3, &OraDef5, 4, &CHAR_VALUE_D5, 0, 0);
lrd_ora8_bind_col(OraStm3, &OraDef6, 5, &DATE_VALUE_D6, 0, 0);
lrd_ora8_fetch(OraStm3, -0, 1, &uliFetchedRows, 0, 2, 0, 0);
lrd_handle_free(&OraStm3, 0);
lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm4, 0);
lrd_ora8_stmt(OraStm4, "SELECT CHAR_VALUE FROM SYSTEM.PRODUCT_PRIVS WHERE (UPPER"
"('SQL*Plus') LIKE UPPER(PRODUCT)) AND ((UPPER(USER) LIKE "
"USERID) OR (USERID = 'PUBLIC')) AND (UPPER(ATTRIBUTE) = "
"'ROLES')", 1, 32, 0);
lrd_ora8_exec(OraSvc1, OraStm4, 0, 0, &uliRowsProcessed, 0, 0, 0, 0,
0);
lrd_ora8_bind_col(OraStm4, &OraDef7, 1, &CHAR_VALUE_D7, 0, 0);
lrd_ora8_fetch(OraStm4, -0, 1, &uliFetchedRows, 0, 2, 0, 0);
lrd_handle_free(&OraStm4, 0);
lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm5, 0);
lrd_ora8_stmt(OraStm5, "BEGIN DBMS_APPLICATION_INFO.SET_MODULE(:1,NULL); END;", 1, 32, 0);
lrd_assign(&P1D8, "SQL*Plus", 0, 0, 0);
lrd_ora8_bind_placeholder(OraStm5, &OraBnd1, "1", &P1D8,
LRD_BIND_BY_POS, 0, 0);
lrd_ora8_exec(OraSvc1, OraStm5, 1, 0, &uliRowsProcessed, 0, 0, 0, 0,
0);
GRID0(4);
lrd_handle_free(&OraStm5, 0);
lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm6, 0);
lrd_ora8_stmt(OraStm6, "SELECT DECODE('A','A','1','2') FROM DUAL", 1, 32, 0);
lrd_ora8_bind_col(OraStm6, &OraDef8, 1, &DECODE_A_A_1_2_D9, 0, 0);
lrd_ora8_exec(OraSvc1, OraStm6, 1, 0, &uliRowsProcessed, 0, 0, 0, 0,
0);
lrd_ora8_print(OraStm6, PrintRow6);
GRID0(6);
lrd_handle_free(&OraStm6, 0);
lrd_ora8_commit(OraSvc1, 0, 0);
lrd_ora8_commit(OraSvc1, 0, 0);
lr_think_time(25);
for(j=1;j<=20;j++)
{
i=j; //如果需要随机的插入数据的话使用i=rand();
itoa(i, word, 10);
lr_save_string (word ,"para");
lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm7, 0);
//lrd_ora8_stmt(OraStm7, "insert into test values(12,'a')", 1, 32, 0);
lrd_ora8_stmt(OraStm7, "insert into test values({para},'a')", 1, 32, 0);
lrd_ora8_exec(OraSvc1, OraStm7, 1, 0, &uliRowsProcessed, 0, 0, 0, 0,
0);
lrd_handle_free(&OraStm7, 0);
}
lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm8, 0);
lrd_ora8_stmt(OraStm8, "commit", 1, 32, 0);
lrd_ora8_exec(OraSvc1, OraStm8, 1, 0, &uliRowsProcessed, 0, 0, 0, 0,
0);
lrd_handle_free(&OraStm8, 0);
lrd_session_end(OraSvc1, OraSes1, 0, 0);
lrd_server_detach(OraSrv1, 0, 0);
lrd_handle_free(&OraEnv1, 0);
return 0;
}
其中的红色部分是修改或添加的部分,最后可以执行一下,效果为:
7、下面来运行负载
添加我们录制的脚本
8、我们测试100个用户登录到数据库,重复的向test表中插入一条由随机数组成的记录,并提交和退出。
这是运行后的结果以及其他相关信息。
然后到数据库里面查看一下,应该是插入的记录数为:100X20=2000
9、然后在结果-分析结果里面分析相关数据。得出相关结论。
10、下面说一下为什么我们loadrunner测试的时候需要插入随机数或者其他的不重复的数据。
先来看一下数据库硬解析的数量。
以sys登录,执行select * from v$sysstat where name ='parse count (hard)';查询
此时的value为1746,然后我们执行重复200次的
insert into test values(12,'a')
然后再查询硬解析的结果为:
现在是1749,没有多大的差别,其值本应该为1747,但可能由于oracle执行了其他的语句,这说明如果我们执行的是同一条SQL的话,在 测试中无法模拟真实环境的压力,因为真实环境中每个用户执行的SQL语句都可能不一样。
(parse count (hard):在shared pool中解析调用的未命中次数。当sql语句执行并且该语句不在shared pool或虽然在shared pool但因为两者存在部分差异而不能被使用时产生硬解析。如果一条sql语句原文与当前存在的相同,但查询表不同则认为它们是两条不同语句,则硬解析即会发生。硬解析会带来cpu和资源使用的高昂开销,因为它需要oracle在shared pool中重新分配内存,然后再确定执行计划,最终语句才会被执行。)
下面我们执行200条不同SQL,
其最后的结果为1950,所以使用随机数来产生sql语句并执行的话应该可以比较良好的模拟真实环境。
LoadRunner 测试Siebel性能
1、本次需要测试的场景是登陆Siebel web应用,创建一个客户,然后退出。
协议选择Siebel-Web,
2、录制好脚本之后,我们需要对脚本进行一下改造,我现在需要每次创建的客户的名称是随机的,而且我在回放脚本的时候添加了部分代码,方便的查看到程序运行的时间。部分代码如下:(红色部分为我所修改的)
int timex(int time_x,int re[])
{
re[0] = time_x/(1000*60*60*24);
re[1] = time_x/(1000*60*60);
re[2] = time_x/(1000*60);
re[3] = time_x/1000;
re[4] = time_x%1000;
return 0;
}
Action()
{
int j;
int i;
char word[50];
long a,b;
int time_x;
int ret[5];
a = clock();
for(j=1;j<2;j++)
{
i=rand();
itoa(i, word, 10);
lr_save_string (word ,"para");
lr_output_message(word);
web_set_max_html_param_len("1024");
web_url("service_chs",
"URL=",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
/* Registering parameter(s) from source task id 5
// {Siebel_sn_cookie3} = "TZARmNMKjOTPxa1RoRtQSSMkGLOXvzkb4oIIlP6ETEHlGdHuse27xQ__"
// */
web_reg_save_param("Siebel_sn_cookie3",
"LB/IC=_sn=",
"RB/IC=;",
"Ord=1",
"Search=headers",
"RelFrameId=1",
LAST);
web_url("start.swe",
"URL=/start.swe?SWECmd=Start&SWEHo=10.195.35.234",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t2.inf",
"Mode=HTML",
LAST);
……………..
由于篇幅,以下省略了,
…………………………….
………………………………..
………………………..
lr_think_time(23);
web_submit_data("start.swe_19",
"Action=/start.swe",
"Method=POST",
"TargetFrame=",
"RecContentType=text/html",
"Referer=",
"Snapshot=t21.inf",
"Mode=HTML",
ITEMDATA,
"Name=s_1_1_37_0", "Value=", ENDITEM,
"Name=SWEVI", "Value=", ENDITEM,
"Name=SWERowId", "Value=1-{Siebel_row_id73}", ENDITEM,
"Name=SWEC", "Value={Siebel_SWECount}", ENDITEM,
"Name=SWEMethod", "Value=WriteRecord", ENDITEM,
"Name=SWEReqRowId", "Value=1", ENDITEM,
"Name=SWERPC", "Value=1", ENDITEM,
"Name=s_1_1_70_0", "Value=", ENDITEM,
"Name=s_1_1_71_0", "Value=有效", ENDITEM,
"Name=s_1_1_61_0", "Value=", ENDITEM,
"Name=SWEApplet", "Value=Account Entry Applet", ENDITEM,
"Name=SWEActiveApplet", "Value=Account Entry Applet", ENDITEM,
"Name=s_1_1_51_0", "Value=N", ENDITEM,
"Name=s_1_1_62_0", "Value=", ENDITEM,
"Name=SWEView", "Value=Account List View", ENDITEM,
"Name=s_1_1_41_0", "Value=", ENDITEM,
"Name=s_1_1_63_0", "Value=", ENDITEM,
"Name=SWECmd", "Value=InvokeMethod", ENDITEM,
"Name=s_1_1_65_0", "Value=家åº", ENDITEM,
"Name=SWETS", "Value={SiebelTimeStamp}", ENDITEM,
"Name=SWEActiveView", "Value=Account List View", ENDITEM,
//"Name=s_1_1_35_0", "Value=LoadRunner Test", ENDITEM,
"Name=s_1_1_35_0", "Value={para}", ENDITEM,
"Name=SWEP", "Value=", ENDITEM,
"Name=s_1_1_69_0", "Value=", ENDITEM,
"Name=SWERowIds", "Value=", ENDITEM,
LAST);
Siebel_SWECount_var += 1;
lr_save_int(Siebel_SWECount_var, "Siebel_SWECount");
lr_think_time(7);
web_submit_data("start.swe_20",
"Action=/start.swe",
"Method=POST",
"TargetFrame=",
"RecContentType=text/html",
"Referer=",
"Snapshot=t22.inf",
"Mode=HTML",
"EncodeAtSign=YES",
ITEMDATA,
"Name=SWEC", "Value={Siebel_SWECount}", ENDITEM,
"Name=SWEMethod", "Value=BatchCanInvoke", ENDITEM,
"Name=SWERPC", "Value=1", ENDITEM,
"Name=SWEActiveApplet", "Value=Account Entry Applet", ENDITEM,
"Name=SWECmd", "Value=InvokeMethod", ENDITEM,
"Name=SWEIPS", "Value=@0*0*7*0*0*3*0*2*#40*2*#00*5*SWEJI5*false2*#10*6*SWEDIC4*true2*#20*2*#30*", ENDITEM,
"Name=SWEActiveView", "Value=Account List View", ENDITEM,
"Name=SWEService", "Value=SWE Command Manager", ENDITEM,
LAST);
web_save_timestamp_param("SiebelTimeStamp",
LAST);
web_url("start.swe_21",
"URL=/start.swe?SWECmd=Logoff&SWETS={SiebelTimeStamp}&SWEPreLd=1&SWEClearLC=1",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t23.inf",
"Mode=HTML",
LAST);
}
b = clock();
time_x = (int)(b-a);
lr_message("间隔时间为:%d 毫秒",time_x);
return 0;
}
执行脚本。可以方便的看到执行时间为12266毫秒。
4、 后续的测试和前面讲的测试oracle类似。不再累述。
Loadrunner 监控Linux服务器资源
1、 为了使Loadrunner能够监控Linux服务器的资源,必须保证有如下的服务包被安装,
rsh-0.17-25.4.i386.rpm
rsh-server-0.17-25.4.i386.rpm
rpc.rstatd-4.0.1.tar.gz
当然这个版本不一定非要一至,前两个安装包一般在光盘里面有,后一个可以在 下载到。
2、 安装:rpm –ivh rsh-0.17-25.4.i386.rpm rsh-server-0.17-25.4.i386.rpm
安装rpc.rstatd :
gunzip rpc.rstatd-4.0.1.tar.gz
tar –cvf rpc.rstatd-4.0.1.tar
修改解压后目录里面configure文件的权限;chmod 777 configure
./configure ---配置
make ---编译
3、 确认内容:vi /etc/xinetd.conf
#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 50 10
}
includedir /etc/xinetd.d
4、 重启xinetd:
service xinetd reload
5、启动rstatd:
在解压后的目录下运行 rpc.rstatd &
6、 验证启动:rpcinfo –p 其输出应为:
100001 5 udp 618 rstatd
100001 3 udp 618 rstatd
100001 2 udp 618 rstatd
100001 1 udp 618 rstatd
7、若需要loadrunner监控weblogic8.1
1.拷贝weblogic.jar到${lr_home}/classes下,同时,删除jmxri.jar或者修改jmxri.jar为任何名称
2.修改${lr_home}/dat/monitors下的WebLogicMon.ini文件,内容如下:
原始内容为:JVM=javaw.exe JavaVersion=1.4;JavaVendor=Sun Microsystems Inc.
修改后内容为:JVM=D:\bea\jdk141_03\bin\javaw.exe JavaVersion=1.4;JavaVendor=Sun Microsystems Inc.
其中D:\bea\jdk141_03\bin\javaw.exe为自己本地weblogic的jdk所在位置
javaVersion为weblogic所用的jdk版本号
在网上有的要求修改Weblogic=weblogic.jar Port=1112,要求把PORT修改为7001,但在这里的实际安装过程中,没有做修改。
3.配置如何监控lr的weblogic(jmx)
打开weglogic(jmx),添加度量
其中监控的计算机名称为:ip:7001,如192.168.1.88:7001,平台选择所写ip的OS
然后点击下面的资源度量的添加,输入登录的用户名和密码,此处的用户名和密码为:ip所在OS上的weblogic的登录用户名和密码
在点击确定后会出现需要监控的资源信息,可以选择自己感兴趣的方面进行监控
7、 在Loadrunner中监控Linux:
|
文件: |
LoadRunner 测试Oracle数据库性能.pdf |
大小: |
2361KB |
下载: |
下载 | |