LoadRunner 测试Oracle数据库及Siebel性能
生活随笔
收集整理的這篇文章主要介紹了
LoadRunner 测试Oracle数据库及Siebel性能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本次測試使用的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=http://10.195.35.234:7777/service_chs",
????????????? "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=http://10.195.35.234:7777/service_chs/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=http://10.195.35.234:7777/service_chs/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=????o-", 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=http://10.195.35.234:7777/service_chs/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=http://10.195.35.234:7777/service_chs/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
當然這個版本不一定非要一至,前兩個安裝包一般在光盤里面有,后一個可以在http://download.csdn.net/source/1585533?下載到。
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数据库及Siebel性能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置HADOOP开发环境
- 下一篇: linux cmake编译源码,linu