Loadrunner万字整理资料【乐搏TestPRO】

一、脚本问题
问题1.1、无法弹出IE浏览器或者录制中出现0事件
原因:一般是由于电脑安装多个浏览器导致
解决:修改IE选项设置,去掉勾选“启用第三方浏览器扩展”

问题1.2、Windows 2003无法录制IE6/7
原因:可能是Windows server 2003默认对IE加载DEP(数据执行保护)特性,而Vugen.exe刚好跟DEP冲突所导致
解决:修改我的电脑→属性→高级→性能(设置)→数据执行保护→添加→将Loadrunner安装目录bin下的Vugen.exe添加进去→确定。重启Loadrunner

问题1.3、录制正常但是脚本中无数据显示
原因:有可能是协议或者是捕获数据的方式导致
解决:在录制中打开Options(选项)→Port Mapping(端口映射)→选择捕获数据的方式或者选择识别协议内容

问题1.4、录制时出现Visual Studio调试器
原因:Windows对数据的保护设置
解决:打开“我的电脑”→属性→高级→性能-设置→数据执行保护→勾选“除所选之外…”→“添加”选择“iexplore.exe”即可

问题1.5、录制时修改参数保存的方式
原因:.net协议录制时,参数默认保存为(Binary)格式
解决:录制时进入→Options→http://Microsoft.net→Recording→Serialzation中将Serialzation format的Value值更改为XML格式

问题1.6、脚本回放正常,未通过
原因:可能是缺少包头。默认情况下是不录制HTTP Header(请求包头),如果有些数据存放在Header中,导致脚本无法正常通过
解决:

利用抓包工具(如HttpWatch),进行抓包分析,找到报头,在请求前添加该报头。如:web_add_auto_header(“x-requested-with”, “XMLHttpRequest”)
查找缺少的报头名,添加包头。在录制中打开Options(选项)→Advanced(高级)→Headers(标题)→Recourd headers in list→添加包头
问题1.7、脚本回放无法正常通过
原因:录制时请求方式
解决:在录制中打开Options(选项)→Recording(高级)→URL Advanced→选择Use web_custom_request only方式录制

问题1.8、脚本出现26601错误
原因:缺少压缩包头
解决:web_add_auto_header(“Accept_Encoding”,“gzip,deflate”);

二、其他问题
问题2.1、Java执行场景时并发数上不去
原因:Spring框架重定向问题
解决:将修改为scope=”prototype”

问题2.2、在场景设置中监控不到服务器
原因:服务没有开启
解决:打开服务→开启相关服务(首先检查Remote Registry服务,然后在开启computer browser,如果computer browser无法开启,检查server、workstation服务)

问题2.3、在生成结果中采集的数据不一致
原因:由于采样的时间
在摘要中,时间是根据整个场景执行的过程进行采样
在平均事务响应时间主要是按照Loadrunner分析出来的采样频率来获取

解决:可通过“set granularity”来修改平均事务响应时间的采样频率,设为场景执行时间,结果会一致。

问题2.4、SilverLight中脚本回放错误
原因:缺少SOAPAtion包头
解决:在录制中打开Options(选项)→Advanced(高级)→Headers(标题)→Recourd headers in list→添加包头

问题2.5、http://microsoft.net协议中无法查看数据文件
原因:默认次方式离职脚本中生成的数据文件类型为Binary,需修改为XML格式
解决:在录制中打开Options(选项)→http://Microsoft.net→Recording→serializatioformat改为XML即可

三、脚本优化
3.1、检查点
函数:web_reg_find、web_image_check和web_find

web_reg_find(文本检查点)函数的使用方法和技巧
web_reg_find(

“Search=查找的范围”,

“Save Count=记录缓冲出现的次数”,

“Test=查找的参数”,

LAST);

If (atoi(lr_eval_string(“{N_count}”)) > 0 )

用法:在缓冲中查找,所以要放在查找内容之前

web_image_check(图片检查点)函数的使用方法和技巧
web_image_check(

“函数标题”,

“ALT\SRC=图片的全路径”,

LAST);

用法:在HTML中使用,要放在查找内容之前,必须勾选run-time→Perferences→Enable Image and Test Check

3.2、关联
函数:web_reg_save_param、web_reg_save_param_ex

web_reg_save_param(_ex)函数的使用方法和技巧
web_reg_save_param(_ex)(

“关联函数名”,

“LB=左边界”,

“RB=右边界”,

“Ord(Ordinal)= 出现的次数”,

“Search = 查找的范围”,

“SaveOffset = 偏移的量”,

“SaveLen = 保存的长度”,

“LAST”);

技巧:在关联参数中随机选值;
方法一:定义变量,使用LR_paramarr_random函数取值,如下:
Char *param;

Param=lr_paramarr_random(“关联函数名”);

Lr_save_string(“Param”,“新参数名”);

方法二:定义随机参数,在Ord(Ordinal)中利用参数随机参数取值,如下:
在参数列表中定义参数random_num

将Ord(Ordinal)={random_num}

3.3、参数
Parameter List界面介绍

File format中Column选项如下:
Comma:以逗号分隔
Tab:以Tab分隔
Space:以空格分隔
Select next row中选项如下:
Sequential:顺序取值
Random:随即取值
Unique:唯一取值
Update value on中选项如下:
Each iteration:每次迭代更新
Each occurrence:每次取值更新
Once:只更新一次
When out of values中选项如下:
Abort Vuser:参数超出后退出
Continue in a cyclic value:参数超出后循环
Continue with last value:参数超出后使用最后一个值
技巧1:如果所需参数中存在空格(逗号),需要在File format中选择以Comma(Tab)分隔,否则参数不可用。或者在参数中的将逗号用“”
技巧2:在Date/Time中可以设置自增自减。在offset标签中勾选Offset parameter
自增:勾选Working days onl

自减:勾选prior to current

技巧3:如果参数过多时,可以将多个参数放到一个参数表中。如下图:

3.4、思考时间
lr_think_time(3);

技巧:如果模拟用户的操作可适当添加思考时间。
如果想获取TPS的值,则不能加思考时间和集合点。

3.5、小技巧
3.5.1、 LR中浮点数相加
double atof( const char *string);//申明

float UpPrice1;

float UpPrice2;

float i=0.1;

char * UpPrice3=(char*)calloc(100,sizeof(char));

lr_save_string( lr_eval_string("{CorrelationParameter_2}"),

“UpPrice1” );

//lr_error_message(“打印结果%s”, lr_eval_string("{UpPrice1}"));

UpPrice2=atof(lr_eval_string ("{UpPrice1}"))+i;

atof( lr_eval_string("{UpPrice1}") );

sprintf( UpPrice3,"%.2f",UpPrice2 );

lr_save_string( UpPrice3,“UpPrice” );

lr_error_message(“打印结果:%s”, lr_eval_string("{UpPrice}"));

使用参数取值用{UpPrice}

3.5.2、 URL编码与解码
URL=http://www.baidu.com/s?wd=%E6%B5%B7%E6%B7"中要对%E6%B5%B7%E6%B7进行参数化,但是由“值”进行URL编码过来的,无法直接用中文参数化,由于LR提供了方法,现在要将中文进行URL编码。

解决方法如下:

URL编码:

lr_convert_string_encoding(“值”,LR_ENC_SYSTEM_LOCALE, LR_ENC_UTF8 , “UnicodeString”);

lr_save_string (lr_eval_string("{UnicodeString}"),“nURLencoder” );

web_convert_param(“nURLencoder”,

“SourceEncoding=PLAIN”,

“TargetEncoding=URL”,

LAST );

lr_output_message(“Url编码 = %s”,lr_eval_string("{nURLencoder}"));

URL解码:

lr_save_string (lr_eval_string("{nURLencoder}"),“URLencoder” );

web_convert_param(“URLencoder”,

“SourceEncoding=URL”,

“TargetEncoding=PLAIN”,

LAST );

lr_convert_string_encoding(lr_eval_string("{URLencoder}"),LR_ENC_UTF8 ,LR_ENC_SYSTEM_LOCALE, “UnicodeString1”);

lr_output_message(“Url解码 = %s”,lr_eval_string("{UnicodeString1}"));

3.5.3、 Base64加密与解密
base64加密:参数化GUID={97FD2AD5-1C5E-43F6-8314-FC980CE54FBC}

void GetBase64Encode(const char* in_str,char* out_str)//加密方法

{static unsigned char base64[] =

“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”;

int curr_out_len = 0;

int i = 0;

int in_len = strlen(in_str);

unsigned char a, b, c;

out_str[0] = ‘\0’;

if (in_len > 0)

{while (i < in_len)

{a = in_str[i];

b = (i + 1 >= in_len) ? 0 : in_str[i + 1];

c = (i + 2 >= in_len) ? 0 : in_str[i + 2];

if (i + 2 < in_len)

{out_str[curr_out_len++] = (base64[(a >> 2) & 0x3F]);

out_str[curr_out_len++] = (base64[((a << 4) & 0x30) + ((b >> 4) & 0xf)]);

out_str[curr_out_len++] = (base64[((b << 2) & 0x3c) + ((c >> 6) & 0x3)]);

out_str[curr_out_len++] = (base64[c & 0x3F]);}

else if (i + 1 < in_len)

{out_str[curr_out_len++] = (base64[(a >> 2) & 0x3F]);

out_str[curr_out_len++] = (base64[((a << 4) & 0x30) + ((b >> 4) & 0xf)]);

out_str[curr_out_len++] = (base64[((b << 2) & 0x3c) + ((c >> 6) & 0x3)]);

out_str[curr_out_len++] = ‘=’;}

else{

out_str[curr_out_len++] = (base64[(a >> 2) & 0x3F]);

out_str[curr_out_len++] = (base64[((a << 4) & 0x30) + ((b >> 4) & 0xf)]);

out_str[curr_out_len++] = ‘=’;

out_str[curr_out_len++] = ‘=’;}

i += 3;}

out_str[curr_out_len] = ‘\0’;}}

Action()

{ char * take;

char * toke;

char res[512];

take=(char *)strtok(lr_eval_string("{GUID}"),"{");//格式化“{”字符串

toke=(char *)strtok(take,"}");//格式化“}”字符串,并将值存入toke中

lr_error_message(“GUID: %s”,toke);

GetBase64Encode(toke,res);//调用base64函数

lr_output_message(res);

return 0;

}

四、运行设置(Run-time Settings)
4.1、General(常规)
Run Logic(运行逻辑)
Pacing(迭代)
Start new Lteration:开始新迭代
As soon as the previous iteration ends:在前一次迭代结束后立即开始
After the previous iteration ends:在前一次迭代结束后延迟
Log(日志)
Enable logging:启动日志
Send messages only when an error occurs:仅在出错时发送消息
Always send messages:始终发送消息
Standard log:标准日志
Extended log:扩展日志
Parameter substitution:参数替换
Data returned by server:服务器返回的数据
Advanced trace:高级跟踪

Think Time(思考时间)
Lgnore think time:忽略思考时间
Replay think time:使用思考时间
As recorded:按录制时记录时间
Multiply recorded think time by_:将录制思考时间乘以_
Use random percentage of recorded think time:使用录制思考时间的随机百分比
Limit think time to _seconds:将思考时间限制为多少秒

Additional attributes(其他属性):略
Miscellaneous(其他)
Error Handing:错误处理
Continue on error:出现错误时仍继续
Fail open transactions on lr_error_message:在lr_error_message上打开失败事务
Generate snapshot on error:出现错误时生成快照

Multithreading
Run Vuser as a process:按进程运行Vuser
Run Vuser as a thread:按线程运行Vuser

Automatic Transactions
Define each action as a transaction:将每个Action定义为一个事务
Define each step as a transaction:将每步定义为一个事务

4.2、Network(网络)
Speed Emulation(速度模拟):略
4.3、Browser(浏览器)
Browser Emulation(浏览器仿真)
Simulate browser cache:模拟浏览器缓存
Cache URLs requiring content(HTMLs):缓存网址需要的内容(HTMLs)
Check for newer versions of stored pages every visit to the page:每次访问该页时检查已存储页的较新版本

Download non-HTML resources:下载非HTML资源
Simulate a new user on each iteration:每次迭代模拟一个新用户
Clear cache on each iteration:在每一次迭代中清除缓存

4.4、Internet Protocol(Internet协议)
Proxy(代理服务器):略
Preferences(首选项)
Enable Image and text check:启用图像和文本检查点
Hits per second and HTTP codes:每秒点击次数和HTTP代码
Pages per second (HTML Mode only):每秒页数(仅HTML模式)
Response bytes per second:每秒响应字节数
Winlnet replay instead of Sockets(Windows only):WinInet重播,而不是套接字
File and line in automatic transaction names:自动事务名中的文件和行号
Non-critical resource errors as warnings:非关键资源错误
Save snapshot resources locally:在本地保存快照资源
Download Filters(下载筛选器):略
ContenCheck(内容检查):略
4.5、Date Format Extension(日期格式的扩展)
Configuration(组态):略
五、场景设置(手工场景)
5.1、手工场景
5.1.1、集合点策略
Scenario(场景)→Rendezvous(集合点)→Policy(策略),内容如下:
Release when __% fo all Vuser arrive at the rendezvous:所有用户中X%到达集合点时,释放
Release when __% fo running Vuser arrive at the rendezvous:所有正在运行的用户中X%到达集合点时,释放
Release when __ Vuser arrive at the rendezvous:当X个用户到达集合点时,释放
Timeout between Vuser __ Sec:每个用户到达集合点后等待下一个用户的最长时间
5.1.2、Run-time Settings(此略)
主要关注:思考时间、迭代时间、缓存的设置
5.1.3、用户数
选择Scenario→convert scenario to the percentage mode(转换场景的百分比模式)设置每个脚本所需要的用户数
5.1.4、日志
选择Results→Results Setting,打开Set Results Directory设置:选择日志存放的目录
Automatically create a results directory for each scenario execution:自动创建每个方案的执行结果目录
Automatically overwrite existing results directory without prompting for confirmation:自动而不提示确认,覆盖现有结果目录
5.1.5、负载机
开启需关闭防火墙,启动Agent(程序Loadrunner→Tool→Loadrunner Agent Running Setting Configuration),查看80端口是否被占用。同时开启Network DDE和Network DDE DSDM服务
5.1.6、IP欺骗
使用IP欺骗时,本机的网卡需要处于非DHCP模式下
IP欺骗操作步骤:
首先打开Loadrunner中Tool菜单下的IP Wizard工具,输入服务器IP
然后添加IP(一般采用B类地址,C类区域下只有255)
再使用IP Wizard工具将IP地址写入网卡,重启网卡完成生效

设置IP的运行模式:选中Controller中Tool菜单下的Expert mode模式,然后打开Tool菜单下的Options对话框,在General标签中设置IP的运行模式(进程或线程)
在使用时,将Enable IP Spoofer选中:在Controller中Scenario菜单下的选中Enable IP Spoofer即可
5.2、目标场景
5.1.1、提供的5种目标
1、Virtual Users(虚拟用户数)

2、Hits per Second(每秒点击率)

3、Transaction per Second(每秒事务数)

4、Transaction Response Time(事务的响应时间)

5、Pages per Minute(每分钟页面的刷新次数)

5.1.2、Scenario Settings(场景设置)
1、Run Time是指当前目标达到后,需要运行的时间

2、Stop scenario and save results:未达到目标,场景停止运行

3、Continue scenario without reaching:未达到目标,场景继续运行

4、Receive notification出现目标未达到时,提示信息

5.1.3、Load Behavior(负载生成)
1、Automatic:自动(每2秒运行50个用户)

2、选择Controller达到目标之前,场景运行的时间

3、选择Controller达到定义的目标的速度(用户数/点击率/页面数)

5.3、监控以及指标
5.3.1、服务器资源监控指标
CPU
ata-draft-node=“block” data-draft-type=“table” data-size=“normal” data-row-style=“normal”>
监控指标 指标分析
% Processor Time CPU的使用率,一般不超过80%
% Privileged Time 指CPU内核时间在特权模式下处理线程执行代码所花时间的百分比(如果该值和Physical Disk值一直很高,表明I/O有问题。通过设置Tempdb in RAW、减低“max async IO”和“max lazy write IO”都会降低该值)
% User Time 消耗CPU的数据库操作。若为应用服务器,该值较大,通过算法优化等方法降低该值;若为数据库服务器,该值较大,通过对数据库进行优化增加索引、使用简单的表连接、水平分割大表格来降低该值
Processor Queue Length 就绪的线程数,一般为2,超过说明处理器存在问题
内存
ata-draft-node=“block” data-draft-type=“table” data-size=“normal” data-row-style=“normal”>
监控指标 指标分析
Available Mbytes 可用物理内存,不小于15%(如果该值很小,说明内存可能不足,没有释放)
Committed Byte 内存泄露监控,一般不超过物理内存的75%
Page Faults/sec 页面错误,表明数据不能再内存中立即使用
Page Read/sec 越低越好,此值过大表明是磁盘读而不是缓冲读,一般小于5正常
Pages/sec 从磁盘读取或写入的页面数,正常值小于20.如果服务器没有足够的内存处理其工作负荷,这值一直很高,大于80就有问题
磁盘
ata-draft-node=“block” data-draft-type=“table” data-size=“normal” data-row-style=“normal”>
监控指标 指标分析
%Free Space 指没有占用的磁盘占整个逻辑磁盘的百分比,一般大于15正常
%Idle Time 指一段观察时间间隔内,磁盘空闲的时间,一般大于20正常
%Disk Time 指磁盘执行读和写服务所用时间,一般小于80正常
Avg.Disk Sec/Read 指每次从磁盘读取数据所花费的时间,一般小于25正常
Current Disk Queue Length 磁盘上当前请求的数量,一般小于2正常
Avg.Disk Queue Length 指读和写请求的平均数,一般在2—3之间正常
Avg.Disk sec/Transfer 计数器反映磁盘完成请求所用的时间。较高的值表明磁盘控制器由于失败而不断重试该磁盘。这些故障会增加平均磁盘传送时间。对于大多数磁盘,较高的磁盘平均传送时间是大于0.3 秒
Avg.Disk Bytes/Transfer 该值大于 20 KB,表示该磁盘驱动器通常运行良好;如果应用程序正在访问磁盘,则会产生较低的值。例如,随机访问磁盘的应用程序会增加平均 Disk sec/Transfer 时间,因为随机传送需要增加搜索时间
系统
ata-draft-node=“block” data-draft-type=“table” data-size=“normal” data-row-style=“normal”>
监控指标 指标分析
Context Switches/sec 指计算机上的所有处理器全都从一个线程转换到另一个线程的综合速率(上下文切换次数)
进程
ata-draft-node=“block” data-draft-type=“table” data-size=“normal” data-row-style=“normal”>
监控指标 指标分析
Working Set 处理器线程最近使用的内存页,反映了每个进程使用的内存页的数量
Private Byte 指进程所分配的无法与其他进程共享的当前字节数量。该计数器主要用来判断进程在性能测试过程中有无内存泄露,该值持续增加则说明内存泄露
网络
ata-draft-node=“block” data-draft-type=“table” data-size=“normal” data-row-style=“normal”>
监控指标 指标分析
Bytes Total/sec 发送和接受字节的速度,和目前网络带宽相除应小于50%
Request/sec 每秒执行的请求数和当前执行的请求数,如果该值比较小,Web程序可能是瓶颈
5.3.2、数据库监控指标
SQL Server
ata-draft-node=“block” data-draft-type=“table” data-size=“normal” data-row-style=“normal”>
监控指标 指标分析
Processor%Processor Time CPU使用率
Access Methods\Full Scans/sec 全表扫描,一般小于2
Latches\Latch Waits/sec 每秒锁等待的数量
Locks\Number of Deadlocks/sec 死锁的请求数量,一般为0
Locks\Lock Waits/sec 当前进程完成之前强制其他进程等待的每秒锁定请求的数量
Buffer Manager\Buffer Cache Hit Ratio 缓存命中中总次数与缓存查找总次数之比,一般90%以上
Cache Manager\Cache Hit Ratio 高速缓存命中率,一般小于85%,可能内存问题
GeneralStatistics\Logins/sec 每秒登录到SQL Server的计数
GeneralStatistics\User Connestions 显示当前SQL的用户数
SQL statistics\Batch Requests/sec 每秒收到的Transact-SQL命令批数,该值高说明吞吐量很好(I/O、用户数、高速缓存大小、请求的复杂程度)
Oracle
ata-draft-node=“block” data-draft-type=“table” data-size=“normal” data-row-style=“normal”>
监控指标 指标分析
Buffer Nowait% 缓存区获取Buffer未等待比率,一般接近100%,如果该值较低,则可能要增加Buffer Cache
Redo Nowait% Redo缓存区获取Buffer未等待比率,一般接近100%,如果该值较低,则出现2种情况:1、online redo log没有足够的空间;2、log切换速度较慢
Buffer Hit% 缓存命中率,一般90%以上,否则需要调整。如果持续小于90%,可能要加大db_cache_size,也有可能是潜在的全表扫描导致命中率低
IN-memory Sort% 内存排序率,一般接近100%,如果该值较低,说明出现了大量排序时的磁盘I/O操作,则可能要加大sort_area_size参数的值
Db file scattered read(cs) 文件分散读取,该等待事件通常与全表扫描有关。如果这个等待事件比较显著,可能说明对于某些全表扫描的表,没有创建合适的索引。尽管在特定条件下执行全表扫描可能比索引扫描更有效,但如果出现这种等待时,最好检查一下这些全表扫描是否有必要
Db file seqiemtial read(cs) 文件顺序读取,该等待事件通常与单个数据块祥光的读取操作有关。如果这个等待事件比较显著,可能表示在多表连接中,表的顺序存在问题,或可能不合适地使用了索引。如果出现问题,首先检查索引扫描,以保证每个扫描都是必要的,并检查多表连接的顺序
Monory Usage% 共享池内存使用率,该指标是在采集点时刻,共享池内存被使用的比例。一般为75%-90%,如果值太低,就会造成内存浪费;如果值太高,会使共享池的组件老化。如果SQL语句被再次执行,则发生硬分析
Logons current 当前登录的总数
Total file opens 由实例执行的文件打开总数。每个进程需要许多文件(控制文件、日志文件、数据库文件)以便针对数据库进行工作
Bytes received via SQL * Net from cline 通过Net8从客户端接受的总字节数
SQL *Net roundtrips to/from client 发送到客户端和客户端接收的Net8小心的总数
Bytes sent via SQL *Net to client 从前台进程中发送到客户端的总字节数
Mysql(MONyog、LR sitescope)
ata-draft-node=“block” data-draft-type=“table” data-size=“normal” data-row-style=“normal”>
监控指标 指标分析
Threads_connected 当前客户端已连接Mysql的用户数。
Threads_running 如果数据库超负荷了,将会得到一个正在增长的数值。一般该值超过限定值时,若在5s内有回落,说明没有问题
Aborted_clients 客户端被异常中断的数值。异常中断可能表面一些应用程序有问题
Questions 每秒获得的查询数量,也可以使全部查询的数量
Opened_tables 值表缓存没有命中的数量。如果该值大,需要增加Table_cache的数值
Slow_queries 没有使用索引查询数量。该值长表面系统有性能问题
Threads_created 该值较高可能需要增加Table_cache的数值。持续增加存在潜在问题
Pending normal aio reads 该值是innodb io请求查询的大小(size)。如果该值大到超过了10—20,你可能有一些瓶颈
reads/s, avg bytes/read, writes/s, fsyncs/s 这些值是io统计。对于reads/writes大值意味着io子系统正在被装载。适当的值取决于你系统的配置
Buffer pool hit rate 这个命中率非常依赖于你的应用程序。当你觉得有问题时请检查你的命中率
inserts/s, updates/s, deletes/s, reads/s 有一些Innodb的底层操作。你可以用这些值检查你的负载情况查看是否是期待的数值范围
Select_full_join 没有主键(key)联合(Join)的执行。一般是零。捕捉开发错误的好办法
Select_scan 执行全表搜索查询的数量。如果持续增长说明需要优化,缺乏必要的索引或其他问题
5.3.3、应用服务监控指标
IIS
ata-draft-node=“block” data-draft-type=“table” data-size=“normal” data-row-style=“normal”>
监控指标 指标分析
Not Found Error 服务器无法回应的请求数
Bytes Sent/Sec 服务器送出数据字节的比率
Bytes Received/Sec 服务器接收数据字节的比率
Maximum Connections Web服务同时建立的最大连接数
Total Connections Attempts 服务器利用Web服务尝试连接的总数
GET Request/Sec 使用GET方法请求的速率
POST Request/Sec 使用POST方法请求的速率
Current File Cache Memory Usage 当前用户模式文件缓存使用的字节数
Apache
ata-draft-node=“block” data-draft-type=“table” data-size=“normal” data-row-style=“normal”>
监控指标 指标分析
#Busy Servers 处于繁忙状态下服务器的数量
#Ldle Servers 处于空闲状态下服务器的数量
Apache CPU Usage Apache服务所使用的CPU百分比
Hit/sec Http的请求速率
KBytes Sent/sec 从 Web 服务器发送数据字节的速率
WebLogic
ata-draft-node=“block” data-draft-type=“table” data-size=“normal” data-row-style=“normal”>
监控指标 指标分析
JVMRuntime
HeapSizeCurrent 返回当前JVM堆中内存数
HeapFreeCurrent 返回当前JVM堆中空闲内存数
JMSRuntime
ConnectionsCurrentCount 返回JMS服务器上当前的连接数
JMSServerCurrentCount 返回当前JMS服务的连接数
JMSSServerHighCount 返回自服务器启动后JMS服务的最大连接数
ConnectionsHighCount 返回本JMS服务器自上次重置后的最大连接数
ExecuteQueueRuntime
ExecuteThreadCurrentldleCount 返回队列中当前空闲线程数
PendingRequestOldestTime 返回队列中最长的等待时间
PendingRequestCurrentCount 返回队列中等待的请求数
Queue Length 队列长度
JDBCConnectionsPoolRuntime
WaitingForConnectionHighCount 返回JDBCConnectionsPoolRuntimeMBean最大等待连接数
WaitingForConnectionCurrentCount 返回当前等待连接的总数
MaxCapacity 返回JDBC池的最大能力
WaitSecondHighCount 返回等待连接中的最长时间等待者的秒数
ActiveConnectionsCurrentCount 返回当前活动连接总数
ActiveConnectionsHighCount 返回本JDBCConnectionsPoolRuntimeMBean上最大活动练级数
六、结果分析
6.1、应用服务器出现瓶颈的原因
应用服务器配置不当。比如缓存、超时时间、保持连接等各种属性的设置等。
系统资源。比如内存、CPU、磁盘性能不足。
6.1.1、内存不足
监控Available Mbytes、Page read/sec、Page Faults/sec以及%Disk Time

Memory\Page Reads/Sec:持续大于5,可能存在内存不足
Memory\Page/sec:大于80,内存可能存在问题
PhysicalDisk%Disk Time:大于80,内存可能存在问题。当内存不足时,有点进程会转移到硬盘上去运行,造成性能急剧下降,而且一个缺少内存的系统常常表现出很高的CPU利用率,因为它需要不断的扫描内存,将内存中的页面移到硬盘上。
6.1.2、内存泄露
监控Available bytes、Private Bytes、Working Set以及%Disk Time

如果Process\Private Bytes计数器和Process\Working Set计数器的值在长时间内持续升高,同时Memory\Available bytes计数器的值持续降低,则很可能存在内存泄漏。
6.1.3、CPU瓶颈
监控Processor Queue Length、%Processor Time以及Context Switches/sec

如果System/Processor Queue Length显示的队列长度持续>=2,并且处理器的利用率Processor /%Processor Time大于80%(95%),可能处理器存在瓶颈(一定是CPU瓶颈)。如果此时Processor /%Processor Time一直很低,可能是由于处理器阻塞引起。
6.1.4、磁盘问题
监控Disk Reads/sec、Disk Writes/sec、Current Disk Queue Length、% Disk Time以及LogicalDisk\ % Free Space

Disk Time和Avg.Disk Queue Length的值很高,而Page Reads/sec页面读取操作速率很低,可能存在磁盘瓶颈。
Current Disk Queue Length 和 % Disk Time 的值始终较高,可能磁盘存在瓶颈。可以考虑升级磁盘驱动器或将某些文件移动到其他磁盘或服务器。
6.2、程序代码出现瓶颈的原因
服务器资源的不合理使用。如内存的申请和释放等。
采用了不合理的数据结构或者陈旧的调用。
数据库查询语句编写上的不合理。
网页文件尺度过大。
代码逻辑的缺陷。
6.2.1、程序问题
监控throughout、%Processor Time以及context switches/sec

如果系统由于应用程序代码效率低下或者系统结构设计有缺陷而导致大量的上下文切换(context switches/sec显示的上下文切换次数太高),那么就会占用大量的系统资源,如果系统的吞吐量降低并且CPU的使用率很高,并且此现象发生时切换水平在15000以上,那么意味着上下文切换次数过高
6.2.2、利用VS_Profiler分析程序
安装配置VS_Profiler
安装(略)
配置环境变量:PATH://安装路径
VS_Profiler的操作步骤
打开DOC命令窗口,进入Profiler.exe程序安装的目录
启动Profiler环境:VSPerfCLREnv /sampleon
输入VSPerfCmd/start:sample/output:PeopleTraxReport.vsp/launch:PeopleTrax.exe
通过VSPerfCmd开始分析PeopleTrax.exe程序,并探查器过程开始把收集的分析数据写入报告peopleTraxReport.vsp文件。

注:如果要测试代码级的性能问题,需开发提供PDB类型文件,如果不能提供,只能定位到API接口,而不能精确到具体函数方法的代码级的情况

测试完毕后。关闭分析程序:VSPerfCmd/shutdown或VSPerfCLREnv/sampleoff或VSPerfCLREnv/globaloff
查看文件是否生成:dir 文件名
启动Visual Studio 2010,将生成文件PeopleTraxReport.vsp直接导入。
原理:通过Visual Studio的IDE打开文件并分析. 打开PeopleTraxReport.sdp命令如下:VSPerfReport

PeopleTraxReport.vsp /output: /summary:all

七、资源调优方法
7.1、CPU问题
考虑使用更高级的CPU代替目前的CPU
对于多个CPU,考虑CPU之间的负载分配
考虑在其他体系上设计系统,例如增加前置机、设置并行服务器等
7.2、内存和高速缓存
内存的优化包括操作系统、数据库、应用程序的内存优化
过多的分页与交换可能降低系统的性能
内存分配也是影响系统性能的主要原因
保证保留列表具有较大的邻接内存块
调整数据块缓存区大小(用数据块的个数表示)是一个重要内容
将最频繁使用的数据保存在存储区中
7.3、磁盘(I/O)资源问题
磁盘读写进度对数据库系统是至关重要的,数据库对象在物理设备上的合理分布能改善性能磁盘镜像会减慢磁盘写的速度
通过把日志和数据库对象分布在独立的设备上,可以提高系统的性能
把不同的数据库放在不同的硬盘上,可以提高读写速度。建议把数据库、回滚段、日志放在不同的设备上
把表放在一块硬盘上,把非簇的索引放在另一块硬盘上,保证物理读写更快。
7.4、调整配置参数
包括操作系统和数据库的参数配置
并行操作资源限制的参数(并发用户的数目、会话数)
影响资源开销的参数
与I/O有关的参数
7.5、应用系统网络设置
可以通过数组接口来减少网络呼叫。不是一次提取一行,而是在单个往来往返中提取10行,这样效率较高
调整会话数据单元的缓冲区大小
共享服务进程比专用服务进程提供更好的性能
八、SQL调优
8.1、调优的原则
在应用系统的设计、开发过程中,应始终把性能放在考虑的范围内。
确定清晰明确的性能目标是关键。
必须保证调优后的程序运行正确。
性能更大程度是取决于良好的设计,调优技巧只是一个辅助手段。
调优过程是叠代渐进的过程,每次调优的结果要反馈到后续的代码开发中去。
性能调优不能以牺牲代码的可读性和维护性为代价。
8.2、调优的方法
类似where条件中的具体内容都可以修改为参数化,减少SQL语句的解析次数。
将SQl语句中“*”修改为具体的字段名称
在同一业务中出现两个相同的语句,建议删除一个。如果作用相同,建议取消一个。如果不能取消,这两个命令最好格式和内容完全一致,这样相同的语句执行两次,利用缓冲就可以减少解析次数。
更新表中的字段时,条件可以通过唯一主键就可以定位具体的记录,而不需要所以的条件。建议将冗余的条件删除。
减少数据连接和WCF的调用。
如果是复合索引,只有在它的第一列(leading column)被where子句引用时,优化器才会选择使用该索引。
避免在索引列上使用空值。
在子查询里用exists替代IN,性能效率会得到提高,用表连接的方式比用exists的性能会得到提高。
尽量多使用COMMIT(该命令用于把事务所做的修改保存到数据库)的操作,程序性能得到提高,需求也会因COMMIT所释放的资源而减少。
8.3、数据库出现瓶颈的原因
索引设计不合理
内存容量受限制
数据库表字段设计部合理
数据量大并且没有采取一定措施进行分库分表
数据库配置问题(见常用数据库的配置)
8.4、SQL调优的思路
一般数据库的操作时间都是执行时间和等待时间,在无法估计执行时间的时候主要看等待时间,等待时间又分2种:锁等待时间和资源等待时间。

首先,用Sys.dm_os_wait_stats动态性能视图,查看主要的状况。如果Pageiolatch_sh等待很大,那说明Session在等待Buffer Pool的页。如果在一个Session中要Select一些数据,但这些数据刚好没有在Buffer Pool中,那么SQL Server就会分配一些缓存,这些缓存是属于Buffer Pool的,用来存放磁盘读取的数据,而在读取的时候都会给这些缓存上Latch(锁),当存在IO瓶颈的时候,那么磁盘上的数据就不能立即读到Buffer Pool中,就会出现等待Latch的情况。
原因:可能是IO过慢,页可能是在做一些多余的IO造成的。

接下来查看Sys.dm_io_virtual_file_stats性能视图来确定哪个数据库造成了这么大的延迟,并且通过Physical Disk\avg.disk reads/sec和avg.disk writes/sec来确定到底数据库有多少IO负载。
其次,通过Sys.dm_exec_query_stats查看执行计划,在通过查看高物理读的SQL和执行计划看下有没有优化的空间。如添加索引,修改SQL,优化引擎访问数据的方法。
这时,可能SQL语句已经不能再优化了,但是性能还是不行。往往这种SQL是保镖查询类的SQL,会从磁盘中读取大量数据,而很多数据往往在Buffer Pool中找不到,就会发生大量的PageIOLatch_sh等待,此时,我们要看下是否由于内存不足造成的,用Perfmon查看Page file expectancy(页寿命长度),Free list stalls/sec(等待空页的次数)和Lazy writes/sec。如果Page file expectancy波动很厉害,Free list stalls/sec一直大于0,且Lazy writes/sec的量也很大,说明Buffer Pool不够大,但是也可能是SQL写的不严谨,Select很多没有必要的数据。
误区:有时根据Sys.dm_io_virtual_file_stats和一些性能指标,很容易断定IO问题。IO性能不理想,很有可能是Miss index或Buffer Pool的压力造成的。如果只添加硬件设备,往往当数据量增大后,问题依然出现。
8.5、SQL常用的语句
SET STATISTICS IO ON:检查查询所产生的读和写
SET STATISTICS TIME ON:检查查询的运行时间
SET SHOWPLAN:分析查询的计划
DBCC FREEPROCCACHE与DBCC DROPCLEANBUFFERS:清除数据库缓存
Select DATABASEpRoPERTYEX(‘DatabaseName’,‘IsBrokerEnabled’):验证是否开启缓存
开启数据库缓存依赖:
ALTER DATABASE DatabaseName SET NEW_BROKER WITH ROLLBACK IMMEDIATE

ALTER DATABASE DatabaseName SET ENABLE_BROKER

九、常用应用服务器
9.1、IIS
9.1.1、ASP中IIS性能配置
修改Metabase.XML(C:\WINDOWS\system32\inetsrv\Metabase.xml)文件提升IIS的性能

AppAllowDebugging(默认:False)
作用:指定在服务器上能否启用Active Server Page(ASP)调试

当允许执行服务器端调试时,将串行化IIS运用程序线程,对于每个运行程序,同一时间只允许运行一个线程。这会影响繁忙站点的服务器性能。

AspBufferingOn(默认:True)
作用:该属性指定ASP运用程序的输出能不能须要缓存。

AspQueueConnectionTestTime(默认:10)
作用:IIS将所有的ASP请求放置到队列中。

如果请求在队列中等待的时间比AspQueueConnectionTestTime属性指定的时间长,则ASP将在执行请求前检查确定客户端是否仍连接。如果客户端已断开连接,则不处理该请求并且从队列中删除该请求。

AspRequestQueueMax(默认:3000)
作用:该属性指定了允许进入队列的并发ASP请求的最大数目。

当队列占满时,任何试图请求ASP文件的客户端都将收到HTTP500信息。

AspScriptEngineCacheMax(默认:250)
作用:该属性指定了ASP页面将在内存中保存缓存的脚本引擎的最大数目。

AspScriptFileCacheSize(默认:500)
作用:该属性指定了要缓存的预编译脚本文件数。(0为不缓存任何脚本文件)

AspSessionMax(默认:4295967295【0xFFFFFFFF】)
作用:属性指定了IIS允许的最大并发会话数。

当达到该值的限定时,客户端将接收到HTTP500信息。

AspSessionTimeout(默认:20分钟)
作用:属性指定了完成最后的Session对象有关的请求后,保留该对象的时间。

AspProcessorThreadMax(默认:25)
作用:该属性指定IIS可建立的每个处理器的最大工作线程数。

AspTrackThreadingModel(默认:False)
作用:该属性指定了IIS能否检查运行程序建立的任意组件的线程模块

CacheISAPI(默认:True)
作用:该属性指示在第一次运用ISAPI扩展后能否在内存中执行缓存。

当该属性配置为False时,某些扩展不能正常运行,可能引起严重的性能问题。

9.1.2、IIS属性的性能配置
禁止多余的Web服务扩展
IIS支持多种服务扩展,有些扩展存在漏洞容易被攻击者利用,原则将不用的扩展禁止

操作:打开“IIS管理器”→点击“Web服务扩展”,在右侧选择相应的扩展,禁止即可

删除不必要的IIS扩展名映射
IIS默认支持.asp、.cdx等8中扩展名的映射。有些扩展(如.asa、.cer等)存在安全隐患,可以被攻击者利用来获得Webshell

操作:打开“IIS管理器”→右键“默认站点”选择属性→点击“主目录”选项卡→点击“配置”,打开应用程序配置窗口,根据需要选择删除不必要的应用程序映射

取消访问记录
IIS默认开启对Web的访问记录,比如访问时间、客户端IP、Cookiesd等

操作:打开“IIS管理器”→选择具体的Web站点→右键选择属性→点击“主目录”选项卡→取消对“访问记录”的勾选即可

对访问流量进行限制
默认情况下IIS对访问量是没有限制的,如果并发连接过大超过了Web的负载则发生网络拥塞,重则导致服务器宕机

操作:打开“IIS管理器”→选择具体的Web站点→右键选择属性→选择“性能”选项卡→对最大带宽进行设置。同时可对“网络连接”进行连接限制的设置

让Web负载自由伸缩
默认情况下IIS是全负荷地为Web提供服务的,在一定程度上加重了Web负担。利用IIS的Web园,指定用于某个应用程序池的工作进程的数量就可以实现各个Web站点之间的隔离。

操作:打开“IIS管理器”→选择具体的应用程序池→右键选择属性→点击“性能”选项卡→在“Web园”中可对“最大工作进程数”进行设置,IIS在一定时间后(默认20分)自动缩减实际的工作进程数量。

配置应用程序池
创建:打开“IIS管理器”→右键“应用程序池”→选择“新建-应用程序池”
指派:打开“IIS管理器”→选择需要为其指派应用程序池的站点→右键选择属性→点击“主目录”选项卡→在“应用程序设置”中选择相应的应用程序池即可
回收:打开“IIS管理器”→选择具体的应用程序池→右键选择属性→选择“回收”选项卡→根据实际需要进行设置即可
MIME类型配置
网站嵌入了SWF和FLV格式,无法正常运行flash时。

.flv是Flash媒体播放器支持的视频格式。但部分服务器需要进行MIME 类型映射设置,才能支持.flv视频格式

操作:打开“IIS管理器”→选择具体的Web站点→右键选择属性→选择“HTTP头”选项卡→点击“MIME类型”→新建

(扩展名:.flv MIME类型:flv-application/octet-stream)

(扩展名:.SWF MIME类型:flv-application/octet-stream)

9.1.3、修改注册表键值提升IIS性能
通过修改注册表的值提升IIS的性能(切记:备份和重启哟)

\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\InetInfo\Parameters

DisableMemoryCache(默认:0已禁用)
作用:禁用服务器缓存
范围:0-1
注:如果配置为1,就会禁用静态文件缓存

MemoryCacheSize(默认:物理内存的一半)
作用:高速缓存的大小
范围:从0到4GB,缺省值为3072000(3MB)
注:如果服务器网络通信繁忙,并且有足够的内存空间,可以考虑增大该值

MaxCacheFileSize(默认:256KB)
作用:确定可以放在缓存中的文件的最大的大小
注:IIS不缓存大于MaxCacheFileSize字节的文件

MenCacheSize(默认:可用物理内存的一半,以兆字节为单位)
作用:指定IIS用来作为其文件缓存的内存的最大量
范围:0-2500MB
注:如果注册表中没有此值,IIS用作缓存的量不超过可以内存的一半(每隔60秒动态计算出来的)。如果不需要这么多的内存,可以留给其他程序运用

ObjectCacheTTL(默认:30秒,不包括在注册表中,必须手动添加)
作用:指控静态文件缓存的生存时间(TTL)配置,该配置定义对象(包括文件)存放在缓存中的时间长短
范围:0-4294967295(无限定)
PoolThreadLimit(默认:2 * # MB)
作用:PoolThreadLimit指定可以在Inetinfo.exe进程中建立的I/O工作线程的最大数量,该配置将限定同时连接的数量
范围:0-4294967295(无限定)
MaxPoolThreads(默认:4)
作用:MaxPoolThreads指定为每个处理器建立的I/O工作线程的数量
范围:0-4294967295(无限定)
注:该计数不包括ISAPI程序运用的线程

ListenBacklog(默认:15)
作用:指定在队列中允许的等待服务器处理的活动连接的最大数量
范围:1-250
9.1.4、在服务器配置上优化IIS性能
打开“网络连接”→右键“本地连接”→选择属性→在使用项目中选择“Microsoft网络”→点击“属性”,在服务器优化中选择最大化网络应用程序,点击“确定”即可

9.1.5、优化IIS的注意事项
为了提高性能和节约资源,应该只运行需要的协议。这一点很多管理员都没有注意,笔者曾见到在一台只作Web服务的机器上同时安装有NetBEUI、Tcp/IP和IPX协议。显然这是不合理的。
应该将IIS服务器,设置为独立的服务器,不要让服务器去承受域控制器要求的额外负荷。试想:服务器一边在响应用户的登录,一边还要提供IIS服务,性能能不下降吗?
可以把NT服务器的页交换文件分布到多个物理磁盘上,注意是多个“物理磁盘”,分布在多个分区上是无效的。另外,不要将页交换文件放在与WIndows NT引导区相同的分区中。
使用磁盘镜像或磁盘带区集可以提高磁盘的读取性能。
关于日志的记录,应该采用文件记录而不是记录到ODBC数据源。此外,还可以在记录期间增加用来记录日志的内存缓冲区的容量来减少磁盘的活动。该缓冲区的缺省容量值为64KB。
最好把所有的数据都储存在一个单独的分区里。然后定期运行磁盘碎片整理程序以保证在存储Web服务器数据的分区中没有碎片。使用NTFS有助于减少碎片。笔者推荐使用Norton的Speeddisk,可以很快地整理NTFS分区。
虽然SSL可以提供相当可靠的加密传输。但是所需的额外开销会导致IIS服务器速度下降,尤其是在处理大型文件的时候。所以应该只对确实需要保护的目录进行SSL加密。
9.2、Tomcat

9.3、Apache
9.3.1、windows的安装配置
修改网站的发布路径(conf/httpd.conf)
将配置文件中“DocumentRoot和Directory”的值修改为指定路径

设置启用PHP功能(phpapache.dll)
在文件中LoadModule后面添加:

LoadModule php_module “phpapache.dll的路径”

添加后缀名为php的支持
在AddType后面添加AddType application/x-httpd-php .php

添加默认文档index.php,default.php
在DirectoryIndex中添加DirectoryIndex index.html index.php default.php

注:Serversignature安全设置,默认情况下,在安装时这些信息都是可见的。所以请加入下面两条:Serversignature off和Serversignature prod

9.3.2、windows中性能优化参数配置
Hhostnamelookups off
作用:域名查找。首先服务器会对DNS系统做一个反向查询以找出客户系统的主机名,然后又进行正向查询获取主机名是否真实指向客户的IP
options – followsymlinks
作用:关闭符号连接。
注:如果开启此功能,在apache每个请求中包含的每个路径调用一次istat()系统调用。

Sethandler server –status
作用:服务器状态信息(默认是关闭的)
options –indexes
作用:关闭目录浏览
directoryIndex index.php index.html
作用:通配符的设置
注:建议将最常用的放在最前,删除不需要的选项

timeout
作用:等待连接的时间(一般设置为5-10秒)
Keepalive off
作用:是否进行长连接。
注:如果是下载类的应用,因为连接时间比较长,建议开启

如果是网页类应用(图标、js、css、图片等),建议关闭

Maxkeepaliverequests(一般设置100-200)
作用:保持多少个长链接
Keepalivetimeout(一般设置5-15秒)
作用:连接保持的时间,超过设定就回收
MPM模块
多处理方式(multi-processing module)允许特定平台处理多个并发连接

Prefork的工作原理及配置
工作原理:控制进程在最初建立“StartServers”个子进程后,为了满足“MinSpareServers”设置的需要创建1个进程,等待1秒钟继续创建2个进程,在等待1秒继续创建4个….依次按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止。这就是预派生(prefor)的由来。
配置:在apache的配置文件找到下面一段配置

StartServers 5

MinSpareServers 5

MaxSpareServers 10

MaxClients 150

MaxRequestsPerChild 0

MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,apache会自动Kill掉一些多余进程。如果设置的值比MinSpareServers小,apache会自动把其调整为MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers
MaxRequestsPerChild设置的是每个子进程可处理的请求数,每个子进程在处理了“MaxRequestsPerChild”个请求后将自动销毁。.0意味着是无限,即子进程永不销毁。设为0可以使每个子进程处理更多的请求同时又两点重要的好处:a、可防止意外的内存泄露;b、在服务器负载下降的时候会自动减少子进程数。
因此,可根据服务器的负载来调整这个值,但也不能太小(不断开启新的apache进程,造成资源浪费)。

MaxClients是最重要的一个,设定的是apache可以同时处理的请求,是对apache性能影响最大的参数。可根据硬件配置和负载情况来动态调整这个值。
Worker的工作原理及配置
工作原理:由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的“ThreadSperChild”线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成进程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;二MaxClients设置了所有子进程中的线程数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。
配置:在apache的配置文件找到下面一段配置

StartServers 2

MaxClients 150

MinSpareThreads 25

MaxSpareThreads 75

ThreadsPerChlid 25

MaxRequestsPerChild 0

MinSpareThreads和MaxSpareThreads参数对apache的性能影响并不大,可以按照实际情况做相应调节。
ThreadsPerChlid是worker mpm中与性能相关最密切的指令。如果负载较大,需要使用ThreadsLimit指令来调节该指令的大小。
9.3.3、linux的安装配置
配置系统启动时自动启动apache服务
在/etc/rc/d/rc.local上添加/usr/local/apache/bin/apachectl -k start

在http.conf配置文件中修改参数
设置根目录的路径
根目录是指apache存放配置文件和日志文件的目录,配置参数为ServerRoot,默认位于“/usr/local/apache”

设置系统管理员E-mail
使用ServerAdmin参数设置

设置服务器主机名称
使用ServerName参数设置主机名称

设置监听IP地址及端口号
使用Listen 80参数进行监听(默认端口80)

设置主目录的路径
使用DocumentRoot参数来配置路径

设置默认文件
Apache的默认文件名为index.html,使用Directory Index参数来配置文件

9.4、WebLogic

9.5、JBoss
十、Loadrunner常用的函数

领取相关loadrunner资料点击此处

你可能感兴趣的:(互联网,软件测试,自动化测试,数据库,uefi,linux,mysql,loadrunner)