Chinaunix首页 | 论坛 | 博客
  • 博客访问: 440092
  • 博文数量: 35
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 444
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-02 21:42
文章分类
文章存档

2009年(35)

我的朋友

分类: Oracle

2009-08-18 21:19:46

附件具有截图
 
  本次测试使用的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
下载: 下载
 
 
阅读(91290) | 评论(2) | 转发(4) |
给主人留下些什么吧!~~

koolji2013-07-16 15:11:13

受教了,感谢分享