LR總結筆記(二)

負載測試、壓力測試、配置測試、併發測試、可靠性測試、基準測試
P3 P4
系統資源監控
windows:
1.使用loadrunner直接監控,但是C盤必須能訪問,在LR的Monitors下面有Add Measurements可以添加度量
2.使用性能工具:在計算機管理內---性能---監視工具---性能監視器,可以查看當時性能。
Windows性能日誌

  Windows Server 2008引入了數據收集器集和報告。利用數據收集器集可以指定希望跟蹤的性能對象和計數器集。

  可以使用單一數據集生成多個性能計數器和跟蹤日誌,還可以:

(1)指定訪問控制,以管理誰可以訪問所收集的數據。

(2)爲監視創建多個執行計劃和停止條件。

(3)使用數據管理器控制所收集數據和報告的大小。

(4)根據所收集的數據生成報告。 
性能---數據收集器集---用戶定義---右鍵新建數據收集器集---選擇手動創建---選擇創建數據日誌勾選性能計數器---添加計數器---設置時間間隔單位爲秒或其他---保存位置:%systemdrive%\PerfLogs\Admin\Sql性能監視器---選擇保存並關閉---找到剛創建的集,內有一個數據收集器,右鍵屬性---從“日誌格式”列表中選擇“逗號分隔”---找到剛剛創建的集,右鍵屬性---在計劃選項卡上,添加監視計劃,然後結束設置。
內存三個指標:Available Bytes(可用,不小), Memory pages(硬頁錯誤從磁盤讀取或寫入速度,不高),Page Faults(出錯頁面的平均數,不高)
內存泄露:1.進程分配內存後,但未將用完的內存回收,該進程越來越大。2.觀測內存分配池Pool Paged Bytes,內存分配池中可用內存消耗不斷上升。

磁盤四個指標:%Disk Time(忙於讀寫請求服務的時間百分比,<10),Averge Disk Queue Length(平均隊列,<0.5),Averge Disk Seconds/Read/Write(平均讀寫,無,但分尋道、旋轉延遲、數據傳輸)

CPU三個指標:%ProcessorTime(使用率<85,user進程 system進程),%UserTime(user進程),%PrivilegedTime(system進程)

linux
1.命令監控
CPU三個指標:運行態、就緒態、等待態(阻塞態)1.CPU隊列 2.CPU繁忙程度 3. CPU高密集程序

CPU隊列、CPU繁忙程度命令:vmstat 2 10 隔2秒 採集10次
r 可運行的內核線程平均數據,不能大於CPU的數目
b VMM虛擬內存等待隊列中的內核線程平均數 <核數*0.7 2盒小於1.4
cs 每秒上下文切換次數
us和sy和id 是cpu的用戶和系統進程和空閒比( <15)

CPU高密集程序命令:ps -au 進程 au由高到低排列 ef由低到高排序

內存SWAP(使用虛擬內存的塊)Buffers(temp文件讀取)
命令:vmstat 2 10 隔2秒 採集10次
buffer越少越好,cache越多越好。si input,so output比例應該爲0,如果非0就是要靠SWAP調虛擬內存

查看統計信息命令:vmstat -s

查看更細緻信息命令:ps -v
RSS進程大小

磁盤三個指標:物理轉對應多個邏輯轉,邏輯轉對應多個文件系統,文件系統對應掛載點,
命令:iostat 5 2 隔5秒 採集2次
sda是邏輯轉

命令:如果沒有安裝sysstat包 rpm -ivh systat-7.0.2-3.el5.i386 包括iostat、mpstat、sar和sa工具
sar -d 3 3
Avwait就是隊列長度

測試磁盤當時空負載和負載的讀寫當時情況,命令:
寫入:time dd if=/dev/zero of=/test.dbf bs=8k count=30000
讀取:tiem dd if=/dev/sda1 of=/dev/null bs=8k count=30000
讀寫:tiem dd if=/dev/sda1 of=/test1.dbf bs=8k count=30000

網絡使用工具監控

2.nmon監控可以記錄並且寫報告
安裝nmon後 更改權限爲chmod 777 文件夾


Web 服務監控
Apache 需要打開LoadHodule status_module modules/mod_status.so才能打開監控模式

在地址欄輸入http://localhost/server-status
Total accesses:總請求數
Srv PID Acc M SS Req Conn Child Slot Client VHost Request
PID 進程
Req 請求數
Conn 連接數
Child 孩子間接
Request 請求方式
M的方式可以查看下面註釋
帶參數輸入url:?auto是否動態刷新,refresh刷新秒
如:http://localhost/server-status?auto&refresh=5
Total Accesses:總連接量
Total kBytes:接受總字
Uptime:運行總時間
ReqPerSec:平均每秒請求數
BytesPerSec:平均每秒發送的字節數
BytesPerReq:平均每個請求發送的字節
BusyWorkers:正在工作數(線程)
IdleWorkers:空閒數(線程)

運行時配置:
1.AllowOverride是否允許覆蓋,一般是None
2.HostnameLookups 主機對DNS的查找,一般是off
3.FollowSymLinks 是否重複檢查連接符的安全性,可以設置
<Directory>
    Options FollowSymLinks
</Directory>
<Directory/www/htdocs>
    Options-FollowSymLinks+SymLinksIfOwnerMatch
</Directory>
4.內容協商Content Negotiation

多路模塊處理
windows:mpm_winnt
linux:preforkMPM\workerMPM
ThreadsPerChild 每個孩子的進程數 最大是1920,建議100-500之間
MaxRequestsPerChild 默認爲0,建議是1以上數值。
MaxSpareServers 自動爲MaxSpareServers+1,建議比MinSpareServers,如果系統繁忙會啓動這個參數,多餘的會被殺掉。
ServerLimit要比MaxClient大

測試的時候去掉ExtendedStatus On和LoadHodule status_module modules/mod_status.so兩個模塊加#

但是tomcat沒有涉及到!

數據庫監控:
數據庫內外壓力內存瓶頸:
CPU瓶頸:
磁盤瓶頸:
等待類型:1.丟失更新 兩個數據同時對一條數據更新,結果更新的數據並不是兩個數據的總和
2.髒讀 一個數據,其中一個人數據還原到原始數據,被另外一個人已經使用新數據。
3.不可重複讀 因爲數據一直在更新,所以被讀取永遠不是最新的。
4.幻影 一個插入或刪除數據,在另外一個關聯的表內沒有做相同的插入或刪除數據,造成其中一個多出數據。

數據庫的監控使用軟件
可以捕捉阻塞時間,

登錄jojo項目
分開做步驟在analysis有時間統計
open_index 打開頁面
submit_login 提交參數
into_flight 點擊進入業務頁面
find_flight 選擇完成後點擊
select_flight 選擇完成後點擊
pay_flight 選擇完成後點擊,檢查金額
sign_off 選擇退出

賬戶操作參數化 username usersession
出發及到達城市隨機
隨機某個航班

創建參數t001、t002

開始錄製,完成後檢查,開始做usersession的關聯。
<input type=hidden name=userSession value=125074.11964358ztDDfAApAcQVzzzHDizAVpAAAVHf>
web_reg_save_param("userSession1","LB=userSession\" value=\"","RB=\">",LAST);
增加判斷:
web_reg_find("Text=welcome","SaveCount=loginflag",LAST);
進入頁面顯示welcome
if(atoi(lr_eval_string("{loginflag}"))>0)
{
  lr_output_message("loginOK");
  return 0;}
else
{
  lr_output_message("loginFAIL");
  return -1;}
設置斷點調試
打開擴展日誌
並且錯誤的腳本,編譯後試一下。
查看結果:replay---Test Result。

web_reg_save_param("flights","LB=\">","RB=</option>","ORD=ALL",LAST);

兩種隨機循環:
自帶隨機函數lr_paramarr_random("flights");代碼如下:

char *departcity,departcitys[30];
char *arrivacity,arrivacitys[30];
departcity = lr_paramarr_random("flights");
arrivacity = lr_paramarr_random("flights");
//增加一次選擇,防止重複
while(1){
  if(arrivacity == departcity)
    arrivacity = lr_paramarr_random("flights");
  else
    break;
}
lr("%s",departcity);
lr("%s",arrivacity);
sprintf(departcitys,"Value=%s",departcity);把Value=departcity變爲departcitys變量
sprintf(arrivacitys,"Value=%s",arrivacity);
lr("%s",departcitys);
lr("%s",arrivecitys);

可以直接更換"Value="替換爲departcitys,arrivecitys。


設置{departdate}進入Parameter List中選擇Parameter type爲Date並可以更改%a/%d/%y爲%Y,就是年的全稱2018。

在隨機前
web_reg_save_param("fightline","LB=outboundFight\" value=\"","RB={departdate}","ORD=ALL",LAST);
在隨機處
char *flightno;
char flightnumber[25];
flightno = lr_paramarr_random("flightline");
如果判斷參數的關聯:sprintf(flightnumber,"Value=%s%s",flightno,lr_eval_string("{departdate}"));
lr("%s",flightnumber);

可以直接更換"Value=151;285;{departdate}"替換爲flightnumber。
如果是全局變量需要提char flightnumber[25];到外面,從這個action以下都可以使用這個變量。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
另外一種取隨機數:
char departstr[20];
int flightcount;
int departrandnum=0;
flightcount=atoi(lr_eval_string("{flights_count}"));
lr("%s",flightcount);
departrandnum = rand()%(flightcount/2)+1;
sprintf(departstr,"{flights_%d}",departrandnum);
lr(lr_eval_string(departstr));

========================================================
PP15 10:00
發送郵件LR
HTML協議
open_index//打開頁面
submit_login//提交登錄
send_message//進入後等待完成,點擊寫信,輸入地址主題內容併發送
sign_off//點擊退出
http://mail2.163.com

如果LR給的不符,因爲是BS架構,可以查看頁面,
sid=SBGlsUOOhhykEUwQiROOzRPwcwiXGFUt&df=mail163_letter#module=welcome.WelcomeModule%7C%7B%7D

sid=mCsGxnppKBwunzVajLppbUQXxYicYNxz&df=mail163_letter#module=welcome.WelcomeModule%7C%7B%7D

放在獲取地址之前:
web_reg_save_param("usersession","LB=suid:'',sid:'","RB=',cosid:",LAST);
查看回放日誌:發現<string name="info">Func:N/A,Code:FA_INVALID_SESSION</string>
使用Replace替換所有的asldfkjaslkfdjsf爲{usersession}

==================================================
場景舉例:
單交易基準測試
登錄支持10分鐘300個用戶登錄,併發送不少於20,相應時間不超過3秒,業務成功100,CPU內存不超過80%。
分成兩個業務測試類型:業務量測試,併發測試
業務量測試:10分鐘300個用戶,需測試出單詞登錄消耗時間,計算vuser的數量。
通過lr統計,單次登錄消耗6秒,10分鐘內可以模擬出100個用戶登錄,所以需要3個vuser數量。
如果希望模擬真實用戶,用戶名需要參數化,類型file(unique %3d,start=1)類型,300*1.2=360個參數。
如果使用lr構造,可以在run-time settings內run logic內選擇insert block,插入一個塊,然後把要重複操作的插入到塊內,同時更改parameter list內的update value爲each iteration換成each occurrence。因爲要每次觸發換參數,而不是從頭到尾的迭代一次換參數。
==========================================
進入controller
進入controller後查看代碼,選擇腳本再選擇view script,進行更改,但是更改後不會自動更新,需要點擊detail內的refresh---script。
在場景內設計一段時間後,迭代就不起作用。
在run-time setting設置:
在場景內需要啓動發生錯誤需要繼續。在勾選deline each action as a transaction。另外如果想模擬瀏覽器的用戶行爲:選擇browser下的browser emulation---勾選simulate browser cache---勾選cache URLs requiring content---勾選Check for newer versions of stroed page every vi。
還需要設置集合點,來讓壓力集中釋放。
最後需要設置results---set results的位置。

進入run
可以設置顯示16張圖表,在windows 監控內需要添加measurenation計數器,進入後先設置ip,如果是本地就是localhost,然後把下面的都刪了,然後再監控什麼添加什麼,等待5秒後纔會有顯示。
開始跑,然後點擊analysis。


====================================================
一個性能測試的例子,腳本的開發
接口:協議HTTP POST GET
名詞解釋:
URL:
參數:
錯誤相應輸出:
錯誤碼定義:
例子:

vuser_init(){
  lr_load_dll("md5.dll");
  return 0;
}

  char secret_key[32] = "oweolsdoiowiwql";
  char api_key[32] = "zhangdanzhongxin";
  char method[32] = "datacenter.getBillGas";//開發的一個接口
  char timeOfSecond[12];
action(){
  char bd_sig[100];
  typedef long time_t;
  time_t t;
  springf(timeOfSecond,"%ld", time(&t));//拿到時間
  lr_save_string(timeOfSecond, "call_id");//字符串轉參數
  lr_output_message("%s", timeOfSecond);//打印時間
  //bd_sig生成方式:MD5(api_key+call_id+method+secret_key))
  strcpy(bd_sig,api_key);
  strcpy(bd_sig,timeOfSecond);
  strcpy(bd_sig,method);
  strcpy(bd_sig,secret_key);
  lr_save_string((char*)Calculate(bd_sig,strlen(bd_sig)), "MD5");
  //lr_output_message("%s", md5);
  web_reg_save_param("return_code","LB=error_code\":\"","RB=\"","Search=Body","Ord=1",LAST);
  lr_start_transaction("selectGas");
  web_custom_request("t1",
    "URL=http://192.168.21.67:8080/openapi/datacenter?api_key=zhangdanzhongxin&method=datacenter.getBillGas&call_id={call_id}&bd_sig={MD5}&format=json&req_charset=utf-8"
    "&mobile=13800138000&period=201404"
    "&result_fields=All",
    "Method=GET",
    "Snapshot=t1.inf",
    "Mode=HTML",
    LAST);
  lr_end_reansaction("selectGas", LR_AUTO);
  //業務確定是否成功
  if(strcmp(lr_eval_string("{return_code}"),"0") && strcmp(lr_eval_string("{return_code}"),"300"))//比較函數,C語言中比較只能用函數
{
    lr_error_message("no 0 or 300, is %s, EXIT",lr_eval_string("{return_code}"));
    return -1;
  }
  lr_output_message("********************");
}

亂碼出現:web_reg_save_param("error_code","LB=error_msg\":\"","RB=\"","Search=Body","Ord=1",LAST);
使用另外函數單獨處理亂碼:lr_convert_string_encoding(lr_eval_string("{error_code}"),
LR_ENC_UTF8,LR_ENC_UNICODE,"stringInUnicode");
lr_output_message("%s",lr_eval_string("{stringInUnicode}"));

如果由format=json變成format=xml,就需要調取web_reg_save_param_xpath();
tree模式對於xml模式支持比較好可以方便查看。
web_reg_save_param_xpath("ParamName=return_code","QueryString=//response/error_code",SEARCH_FILTERS,"Scope=Body",LAST);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章