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.幻影 一個插入或刪除數據,在另外一個關聯的表內沒有做相同的插入或刪除數據,造成其中一個多出數據。

數據庫的監控使用軟件
可以捕捉阻塞時間,死鎖的時候數據庫如何處理,捕獲死鎖,索引,數據少使用堆表,索引維護


性能:消耗的時間和資源的利用率
性能高:時間少、資源利用低
容量:相同空間,容量大,爲有利
接口測試越來越重要,各種模塊之間進行智能調用
httpwatch測試前端性能
virtualUser虛擬用戶
單交易基準測試:按規定測試
單交易負載測試:需求出發,所能承受的最大負載 100個 200個 1個小時
單交易壓力測試:需求出發,極限情況下系統會崩潰,是否具有自我恢復性100個 多少個小時會有問題
綜合交易測試:
綜合基準測試:
穩定測試:可靠性測試,平均無故障時間越長,修復時間越短越好。
性能測試:特定的負載條件下的性能指標數據。
不加think time接收的壓力大
計算性能時還要取消think time
PV可以刷,按照訪問次數
IP訪問,按照IP計算
吞吐量KB:單位時間接收請求後返回的數量,在對比、評估類測試Tomcat比Weblogic

性能需求:
功能點:一次交易有多個功能
業務:一次交易爲一次業務
交易:和服務的一次事件
提取性能需求:1.併發數 2.用戶頻繁使用,或存在大量用戶使用 3.對於被測對象很熟悉是否有必填
性能測試不做異常分析和測試
對於架構熟悉,對於網絡部署熟悉

性能分析:
1.分析被測對象業務規模
註冊1W,交易數800左右,峯值交易時間段20分鐘完成400左右,峯值併發30
2.分析測試點
a、註冊
根據業務規模分析,每天交易量在800左右,意味着至少有800個用戶登錄,系統存在賬號,測試1W,分解每天。另外,用2、8分析時間內最高訪問量,集中發生的時間。
b、登錄
某個時間點完成400次交易,單次登錄消耗的時間?要求不超過3s
c、訂票
d、查詢
3.確定對應指標

併發數:
查詢峯值得到併發數:使用SQL,使用count函數,datepass。
根據業務量計算併發數:10個註冊成功案例,2分鐘做完,需要幾個人,一個用戶消耗60s時間
HttpWatch打開後進行時間統計,利用loadrunner計算時間,
幾個人就是併發數。
啓動Server,如果報錯可以陪着config
hp\laodrunner\webtours\conf\httpd.conf的#ServerName localhost:1080的#去掉,再啓動服務
可以用HttpWatch計算登錄時間,或者使用loadrunning計算
啓動Virtual User Generator.exe
打開create a new script
打開web-http/html

打開首頁,輸入,提交,退出。

open_index
submit_login
sign_off

create a new script action
deleting the default action
click the recording button
setting the content of the URL address
strat recording
switch the action when the recording is completed
operating browser
close the recording when all operations are done 
Modify think time seconds
replay test
actioning think time and wasted time
click test results
select expand all
modify session:

單次登錄11s

日均200WPV
200*80%=160W
24小時*20%=4.8小時
單次登錄2s
一個用戶4.8*3600s/2=8640次

測試4.8小時能否完成160W以上請求。
===================================================
系統要求5分鐘(300s)內完成200次用戶註冊,響應時間不超過3s,成功率100%,cpu以及內存使用率不超過70%
單次註冊消耗時間10.86s

open_index
into_register
submit_register

300s/10.86=27次
200次/27次=8個Vuser
8*27次=216個測試數據
216*1.2倍=260個測試數據

準備測試數據

響應時間:服務器處理時間(經驗值2,5,8,10)2秒最好
==================================================
#define定義常量
#define COUNT 100
Action()

函數:
int sum(a,b){
  int x,y,z;
  x = a;
  y = b;
  z = x + y;
  return z;
}
Action(){
  lr_output_message("%d",sum(20,30));
  return 0;
}

條件:
Acton(){
  int random;
  random = rand()%3 + 1;//1,2,3隨機
  switch (random){
    case 1:
      lr_output_message();break;
    case 2:
      lr_output_message();break;
    default:
      lr_output_message();
  }
}

循環:
Acton(){
  int i = 1, sum = 0;
  int count;
  do {
    sum = sum + i;
    i++;
//  count = i;
  }while(i<=10);
//  lr_output_message("%d",count);
    lr_output_message("%d",sum);
    return 0;
}

可以用字符數組表示字符串char test[] = "afasdfd";
指針:變量的地址。
指針變量:專門存放變量地址的變量。int *p1,*p2;float *q;
&取地址符號(p1 = &i),*p1取指針變量的內容。

如果使用一個腳本創建100個賬戶,可以迭代100次。也可以使用10個虛擬用戶,每個用戶創建10個賬戶。但是要設置parameter 裏面unique並且設置Allocate Vuser values in the Controller爲 Allocate 10 values for each Vuser。

參數Unique Number:當選擇%03d,查看sample爲001,block是數據塊的意思,如果輸入10就是001-010個數字也就是一個虛擬用戶使用10個數字。另外使用拼接,可以"t{username}"。這樣就是少一些參數輸入。

=============================================
lr_output_message("第一次:%s",lr_eval_string("{paramtest}"));
lr_output_message("第二次:%s",lr_eval_string("{paramtest}"));
=============================================
增加檢查點:需要點擊Snapshot界面,選擇Honzontal下的Recording,同時選擇Page View下的要檢查的部分右鍵選擇Add Text Check Step,進入Find Text界面選擇Save count複選框並在後面填寫標誌位regsiterflag。
在代碼內添加Replace with Parameter,只需要右鍵選擇對應幾個字母,即可參數化之前設置好的參數。
命一個int regsitercount=0; 然後regsitercount = atoi(lr_eval_string("{regsiterflag}"));
if(regsitercount>0)lr_output_message("success");else "fail + %s",lr_eval_string("{username}");
檢查點中的Add Text Check Step,如果在Page View下右鍵找到有可能不是真正要檢查的字符。需要進入Http Data下的對應請求的Raw Data內HTML頁面代碼,找到對應的正確代碼纔可以。
==============================================
關聯函數:
查看前臺頁面代碼,可以看到name="userSession"。
定位提交表單的頁面右鍵,點擊屬性,可以查看對應的url,變然後查看Http Data,就可以查看到userSession的位置。
web_reg_save_param
==============================================
open_index submit_login into_flight find_flight select-flight pay_flight sign_off
賬戶需參數化,username和userSession。出發到達城市隨機。隨機某個具體航班。
如果成功,還要測試失敗是否也生效,代表是否正確的代碼。
web_reg_save_param("usersession","LB=userSession\" value=\"","RB=\"/>",LAST);
web_reg_find("Text=Welcome","SaveCount=loginflag",LAST);
if(atoi(lr_eval_string("{loginflag}"))>0)//lr_eval_string轉字符串,atoi轉int
lr("success");
return 0;
else
lr("fail");
return -1;

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");
lr("%s",departcity);
sprintf(departcitys,"Value=%s",departcity);把Value=departcity變爲departcitys變量

可以直接更換Value=、、、爲departcitys。

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

web_reg_save_param("fightline","RB={departdate}");
char *flightno;
char flightnumber[25];
flightno = lr_paramarr_random("flightline");
如果判斷參數的關聯:sprintf(fligghtnumber,"Value=%s%s",flightno,lr_eval_string("{departdate}"));

另外一種取隨機數:
int flightcount;
int departrandnum=0;
flightcount=atoi(lr_eval_string("{flights_count}"));
departrandnum = rand()%(flightcount/2)+1;
sprintf(departstr,"{flights_%d}",departrandnum);
lr(lr_eval_string(departstr));


SPDY協議:Google開發的基於TCP的應用層協議
Application        --- HTTP
Session            --- SPDY
Presentation(儀式) --- SSL
Transport          --- TCP

WebSocket
在 WebSocket API,瀏覽器和服務器只需要做一個握手的動作,然後,瀏覽器和服務器之間就形成了一條快速通道。
1. Header
互相溝通的Header是很小的-大概只有 2 Bytes
2. Server Push
服務器的推送,服務器不再被動的接收到瀏覽器的請求之後才返回數據,而是在有新數據時就主動推送給瀏覽器。

Clint-Headers
Request-Line:GET/HTTP1.1
Accept:text/html
Accept-Encoding:gzip
Accept-Language:zh-cn
Connection:keep-alve 保持長連接
Cookie:BAIDUID
Host:www.baidu.com
User-Agent:Mozilla

Headers-Received
Status-Line:HTTP1.1 200 OK
...

content:渲染後代碼...

linux:內存swap 有些程序長時間不操作,或物理內存不足啓動swap。
內存paging時時刻刻發生操作。
TCP 三次握手四次揮手
netstat -ae|grep "TIME_WAIT" |wc –l查看網絡中time_wait修改配置文件排除問題。

httpwatch:查看,支持自動化API查詢。Fiddler:本身代理Composer下的Parsed,可以拉拽一次協議查看並修改,端口8888,Inspectors下的Raw就是顯示所有的請求。並且可以測試https,需要Tools下的Fiddler Options下的https traffic。並且可以自定義服務器返回。firbug:修改前臺界面。colasoft:從網卡讀取數據。

netstat -ano,列出所有端口的情況。
tasklist | findstr "8888" 任務管理表內找8888字符串

相應時間:客戶端最多65535、網絡、應用服務器、數據庫
1.DNS 2.Connect 3.Send 4.Wait
清楚DNS ipconfig /flushdns

網絡三個層次:核心層、匯聚層、接入層
網絡吞度量,網絡設備連接

應用服務器:
程序的健壯,小號資源合理
啓動壓縮(壓縮文本而非其他)
緩存
預熱
線程配置

數據庫:
索引是否正常使用(db2分區鍵)
SGA是否分配合理
多用關聯少用in
集合操作能用union all就不用union

最後客戶端接收數據進行渲染

腳本開發的原則:簡單、正確、高效
單用戶循環一次,多次(Vugen)
多用戶循環一次,多次(controller)

查看數據庫:mysql -q 
user datacenter
show tables
show create table Bill_Electric顯示錶的建表結構。
查看錶缺少UNIQUE KEY '' () USING BTREE,聯合組件。
alter table Bill_Electric add unique index AK_UK_Bill_Electric('AccountNo','Mobile','Period')USING BTREE; 表內加入組件。
show variables like '%query%';
set global slow_query_log=1;
set global log_queries_not_using_indexes = 1;

增加一些知識:數據庫:安裝重啓,基本SQL語句,數據庫架構,數據庫原理,mysql的組建、引擎、man查詢幫助、回表、聯合索引,

性能測試報告

新建腳本時,可以選擇java內的java vuser。是編譯的,所以要裝JDK,錯誤提示更精確。Run-time Setting內的Java VM下的Use specified JDK,指定JDK爲C:\jdk-1.6
全部寫在action內,不要去其他地方寫代碼。
不足:有些語法支持不好,例如靜態代碼塊,少用不常用的語法和功能。有時因爲緩存,而需要切換JDK,才能正常。
不足如下:
class StaticBlock1{
  static{
    System.out.println("H");
  }

  public static void main(String[] args){
     System.out.println("L");
  }
}
out:H
out:L
靜態代碼塊,會在new後馬上開始執行,不需要調用。

只有一個類是public,定義class可以在任何位置。

如果需要引入外部的class文件,只需要把文件放入到保存的文件夾內,就可以直接new了。或者在Run-time Setting內classpath添加jar包。

注意:1.腳本中包括自定義的類,需要確保類是線程安全的,如果不確定,使用進程方式,可以充分隔離。
線程安全,同一個對象或變量,被線程爭搶。沒有修改肯定是安全的。線程安全是很難檢測的,但是在大壓力或者CPU資源緊張的時候相對容易發現。
import lrapi.*;
public class Actions{
  private static int iteration_counter = 0;
  public int init(){
    return 0;
  }
  public int action(){
    iteration_counter++;
   return 0;
  }
  public int end(){
    lr.message(iteration_counter);
    return 0;
  }
}
只能加鎖
不要再LR內自己加線程,要LR來加線程。

開發Java Vuser:
1.是否使用(1.強大的開源類庫。2.更方便使用開發的自定義的類。)
2.在eclipse中編寫一個正確的模擬代碼
3.將eclipse代碼移到LR中
4.結合業務特點,對腳本進一步增強
5.使用Controller運行多用的JavaVuser

P46
一般遇到Socket使用java
public class Actions{
  private SendOverSocket sos = null;
  private String receiver = null;
  private int version;
  public int init() throw Throwable{
    sos = new SendOver
  }
}

從web腳本轉化Java Vuser
1.使用sed.exe
2.將要轉換的web腳本複製出來並保存到文本中
3.參數界定符部分需要由於{}手動改成<>
4.打開DOS
5.切換到C:\Program Files\HP\LoadRunner\dat
6.運行..\bin\sed -f web_to_java.sed c:\web.txt > c:\java.txt
7.創建參數並進行其他操作


第15講--虛擬與現實的結合-探索Java虛擬機
Java虛擬機:
虛擬化技術:所謂虛擬化技術就是將事物從一種形式轉變成另一種形式,最常用的虛擬化技術有操作系統中內存的虛擬化,實際運行時用戶需要的內存空間可能遠遠大於物理機器的內存大小,利用內存的虛擬化技術,用戶可以將一部分硬盤虛擬化爲內存,而這對用戶是透明的。
JVM的啓動流程:
java xxx
裝載配置尋找jvm.cfg
根據配置尋找JVM.dll:JVM.dll爲JVM主要實現
初始化JVM獲得JNIEnv接口:JNIEnv接口是爲JVM接口,findClass等操作通過它實現。
找到main方法並運行。

查看虛擬機進程:
package com.test;
public class Test {
public static void main(String[] args) throws InterruptedException {
    System.out.println("************start*************");
    Thread.sleep(30000000);
    System.out.println("*************end**************");
}
}
查看任務管理器內啓動javaw.exe *32

Java虛擬機運行時數據區結構圖

http://www.catalannuan.com/2015/04/02/about-jvm/


 

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