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/


 

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