性能测试专题详细分析.docx
《性能测试专题详细分析.docx》由会员分享,可在线阅读,更多相关《性能测试专题详细分析.docx(22页珍藏版)》请在冰豆网上搜索。
性能测试专题详细分析
性能测试专题分析
撰写人:
王井滨
部门:
**性能测试组
日期:
2011/9/13
软件版本号:
1.0
保密级:
保密
修订记录
日期
文档版本号
修订说明
作者
2011/9/13
V1.0
创建
王井滨
1.专题一性能测试流程
1)性能需求调研
交易选择原则如下
⏹用户量大,用户操作频率高,有高峰期特征,数据量大,数据关联复杂,计算逻辑复杂。
⏹数据操作类型覆盖:
查询(模糊查询,非索引查询,多关联查询,多条件查询),新增,修改,计算。
由于系统删除功能有限且操作量小,不进行删除操作的性能测试。
2)测试环境准备
服务器名称
参考配置
数量
说明
负载均衡器
WEB服务器
应用服务器
数据库服务器
批处理服务器
报表服务器
资讯数据源处理服务器
数据库
磁盘阵列
3)测试策略
首先执行批量处理性能测试,可以获得联机性能测试的大部分数据,然后调整或补充数据,进行联机性能测试,最后进行稳定性测试。
为测试系统的性能是否可以通过提高服务器配置或增加服务器数量而得到提升,首先进行基准测试,然后调整服务器的配置或数量,进行可扩展性测试。
4)测试计划
详见测试计划模板
1)系统简介
2)测试需求
3)测试环境
4)测试组织
5)测试风险
6)测试时机
7)测试策略
8)测试场景
9)测试实施
10)交付物
5)测试用例、测试脚本
参考28_JCB卡非功能测试的测试脚本和测试场景
6)执行测试、
压力测试;
负载测试;
疲劳强度测试;
7)统计分析测试结果
LRanalysis
8)测试报告
Word、Excel、PPT
2.专题二LoadRunner使用
1)银行项目常用协议
HTTP/HTML:
HTML-Based、URL-Based
JAVA:
Eclipse编写开发脚本调用实际业务,LR里Action调用该脚本来实现并发设置
WINDOWSSOCKETS:
报文发送和接收
2)脚本开发及调试
参数化:
selectnextrow和updatevalueon的交叉选择;
常用函数:
lr_eval_string(),lr_save_string(),lr_output_message()等;
C语言函数:
strcat(),strcmp()等;
关联:
自动关联、手动关联
web_reg_save_param(),lr_save_param();
3)场景配置
单一业务场景并发:
基准测试;
混合业务场景并发:
按用户数量分;按业务百分比分;
3专题三应用服务器监控
3.1UNIX
3.1.1性能监控-VMSTAT
vmstat命令用来获得有关进程、虚存、页面交换空间及CPU活动的信息。
这些信息反映了系统的负载情况。
vmstat首次运行时显示自系统启动开始的各项统计信息,之后运行vmstat将显示自上次运行该命令以后的统计信息。
用户可以通过指定统计的次数和时间来获得所需的统计信息。
有关进程的信息有:
r-->在运行队列中等待的进程数
b-->在等待io的进程数
w-->可以进入运行队列但被替换的进程
有关内存的信息有:
avm:
使用的页面数。
fre:
空闲队列中的页面数。
swap-->现时可用的交换内存(k表示)
有关页面交换空间的信息有:
re:
在指定时间间隔内每秒要求收回的页面数。
po:
在指定时间间隔内换入到页面交换空间的页面数。
pi:
由页面交换空间换出的页面数。
fr:
在指定时间间隔内释放的页面数。
sr:
在指定时间间隔内检查的页面数(以确定该页面是否可以释放)。
cy:
按时钟算法每秒扫描的页面数。
mf--》非严重错误的页面
de--》提前读入的页面中的未命中数
disk显示每秒的磁盘操作。
s表示scsi盘,0表示盘号
有关故障的信息有:
in:
在指定时间内的每秒中断次数。
sy:
在指定时间内每秒系统调用次数。
cs:
在指定时间内每秒上下文切换的次数。
in--》设备中断
sy--》系统中断
有关CPU的信息有:
us:
在指定时间间隔内CPU在用户态的利用率。
sy:
在指定时间间隔内CPU在核心态的利用率。
id:
在指定时间间隔内CPU空闲时间比。
wa:
在指定时间间隔内CPU因为等待I/O而空闲的时间比。
cs--》用户进程使用的时间
sy--》系统进程使用的时间
id--》cpu空闲的时间
vmstat可以用来确定一个系统的工作是受限于CPU还是受限于内存:
如果CPU的sy和us值相加的百分比接近100%,或者运行队列(r)中等待的进程数总是不等于0,则该系统受限于CPU;如果pi、po的值总是不等于0,则该系统受限于内存。
vmstat运用举例:
vmstat–f:
显示系统中的子进程数。
vmstat–s:
显示系统中不同的事件。
vmstat–i:
显示系统的中断数。
vmstathdisk0hdisk1:
显示hdisk0、hdisk1的使用情况。
vmstat110:
每隔一秒显示一次系统的运行状况,共显示10次。
3.1.2性能监控-IOSTAT
iostat是I/Ostatistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。
它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。
它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。
语法:
iostat[-t][interval[count]]
interval指每次统计间隔的时间;
count指按照这个时间间隔统计的次数。
3.1.3top
3.2Linux
3.2.1找到最耗CPU的java线程
1ps命令
命令:
ps-mppid-oTHREAD,tid,time或者ps-Lfppid
这个命令的作用,主要是可以获取到对应一个进程下的线程的一些信息。
比如你想分析一下一个java进程的一些运行瓶颈点,可以通过该命令找到所有当前Thread的占用CPU的时间。
2top命令
命令:
top-Hppid
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器
3.2.1.1参数说明
top[-][d][p][q][c][C][S][s][n]
d 指定每两次屏幕信息刷新之间的时间间隔。
当然用户可以使用s交互命令来改变之。
p 通过指定监控进程ID来仅仅监控某个进程的状态。
q该选项将使top没有任何延迟的进行刷新。
如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
S 指定累计模式
s 使top命令在安全模式中运行。
这将去除交互命令所带来的潜在危险。
i 使top不显示任何闲置或者僵死进程。
c 显示整个命令行而不只是显示命令名
3.2.1.2其他命令
top命令执行过程中可以使用的一些交互命令。
从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。
这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。
Ctrl+L 擦除并且重写屏幕。
h或者?
显示帮助画面,给出一些简短的命令总结说明。
k 终止一个进程。
系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。
一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。
默认值是信号15。
在安全模式中此命令被屏蔽。
i 忽略闲置和僵死进程。
这是一个开关式命令。
q 退出程序。
r 重新安排一个进程的优先级别。
系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。
输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。
默认值是10。
S 切换到累计模式。
s 改变两次刷新之间的延迟时间。
系统将提示用户输入新的时间,单位为s。
如果有小数,就换算成ms。
输入0值则系统将不断刷新,默认值是5s。
需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
f或者F 从当前显示中添加或者删除项目。
o或者O 改变显示项目的顺序。
l 切换显示平均负载和启动时间信息。
m 切换显示内存信息。
t 切换显示进程和CPU状态信息。
c 切换显示命令名称和完整命令行。
M 根据驻留内存大小进行排序。
P 根据CPU使用百分比大小进行排序。
T 根据时间/累计时间进行排序。
W 将当前设置写入~/.toprc文件中。
这是写top配置文件的推荐方法
3.2.2判断I/O瓶颈
1mpstat命令
命令:
mpstat-PALL11000
注意一下这里面的%iowait列,CPU等待I/O操作所花费的时间。
这个值持续很高通常可能是I/O瓶颈所导致的。
通过这个参数可以比较直观的看出当前的I/O操作是否存在瓶颈
2iostat命令
命令:
iostat-m-x11000
同样你可以观察对应的CPU中的%iowait数据,除此之外iostat还提供了一些更详细的I/O状态数据,比如比较重要的有:
avgqu-sz:
Theaveragequeuelengthoftherequeststhatwereissuedtothedevice.(磁盘队列的请求长度,正常的话2,3比较好。
可以和cpu的load一样的理解)
await:
Theaveragetime(inmilliseconds)forI/Orequestsissuedtothedevicetobeserved.(代表一个I/O操作从wait到完成的总时间)
svctm和%util都是代表处理该I/O请求花费的时间和CPU的时间比例。
判断是否瓶颈时,这两个参数不是主要的
r/sw/s和rMB/swMB/s都是代表当前系统处理的I/O的一些状态,前者是我们常说的tps,后者就是吞吐量。
这也是评价一个系统的性能指标
3pid命令
命令:
pidstat-ppid-u-d-t-w-h11000
相当实用的一个命令,可以基于当个进程分析对应的性能数据,包括CPU,I/O,IR,CS等,可以方便开发者更加精细化的观察系统的运行状态。
不过pidstat貌似是在2.6内核的一些较新的版本才有,需要安装sysstat包。
ubuntu下,可以通过sudoapt-getinstallsysstat进行安装。
4sar命令
命令:
sar-xpid11000
sar的功能可以覆盖mpstat,iostat的相关功能。
5dstat命令
命令:
dstat-y--tcp11000
通过dstat--tcp可以比较方便的看到当前的tcp的各种状态,不需要每次netstat-nat去看
其他命令
●netstat-natp:
查看对应的网络链接,关注下Recv-Q,Send-Q,State。
●lsof-ppid:
查找对应pid的文件句柄
●lsof-i:
80:
查找对应端口被哪个进程占用
●lsof/tmp/1.txt:
查找对应文件被哪个进程占用
●tcpdump/wireshark:
抓包分析工具
●jstat/jmap/jstack/jps等一系列的java监控命令
4专题四数据库监控
4.1SQLServer数据库
1SQLServer资源监控中指标缓存点击率(CacheHitRatio),该值越高越好。
如果持续低于80%,应考虑增加内存。
2如果FullScans/sec(全表扫描/秒)计数器显示的值比1或2高,则应分析你的查询以确定是否确实需要全表扫描,以及SQL查询是否可以被优化。
3NumberofDeadlocks/sec(死锁的数量/秒):
死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。
该计数器的值必须为0。
4LockRequests/sec(锁请求/秒),通过优化查询来减少读取次数,可以减少该计数器的值。
4.2Oracle数据库
4.2.1Oracle性能优化
Oracle9i的性能优化除了调整kernal之外就是主要对Oracle启动文件的调整,即调整SGA的参数。
注意,不同操作系统不同位数的机器最优的参数不是一样的,这里主要有windows和unix之分,32位和64位之分。
首先需要调大进程数和游标数,一般默认的值对实际应用来说都比较小,比如说,进程数可以调到300,游标数可以调到500。
其次,看一个经验公式:
OS使用内存+SGA+session*(sort_area_size+hash_area_size+2M)<0.7RAM,通常认为此时的SGA比较合理。
这里sort_area_size为64k,hash_area_size为128k(当排序多的时候需要增大sort_area_size,按调整后的值计算),session表示最大并发进程数,假设100个。
假如1G内存的机器,OS占用200M,PGA占用200M左右,那么SGA可以设为400-500M,如果2G内存可以1G给SGA,8G可以5G给SGA。
不过对于32位数据库来说,通常最多只能使用1.7G内存。
然后,SGA内参数设置的基本原则是:
databuffer通常可以尽可能的大,shared_pool_size要适度,log_buffer通常大到几百K到1M就差不多。
具体的:
databuffer1G内存可以设置500M,2G设为1.2G,8G可设为5G。
shared_pool_size不易过大,通常应该控制在200M--300M,如果使用了大量的存储过程,可以根据SGA的值增大到500M,如果增大后命中率得不到提高,则增加是无益的。
具体的:
1G内存可以设置100M,2G设为150M,8G可设为300M。
如不使用java,java_pool_size10-20M即可。
large_pool_size如果不设置MTS,在20M-30M即可,假如设置MTS,可以考虑为session*(sort_area_size+2M)。
最后,关于内存的设置可根据statspack信息和v$system_event,v$sysstat,v$sesstat,v$latch等view信息来考虑微调。
4.2.2Oracle的其他调整
为了Oracle高效率的运行,除了上面提到的内存因素之外,还有就是需要良好的数据库设计:
表、视图、索引和日志的合理规划和建立。
I/O的性能也是重要因素,应尽量减少页交换和页分配。
此外,就是改善检查点的效率
4.2.3Oracle的监控指标
1如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90,那么需要增加SHARED_POOL_SIZE的大小。
快存(共享SQL区)和数据字典快存的命中率:
select(sum(pins-reloads))/sum(pins)fromv$librarycache;
select(sum(gets-getmisses))/sum(gets)fromv$rowcache;
自由内存:
select*fromv$sgastatwherename=’freememory’;
2如果数据的缓存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS参数的值(单位:
块)。
缓冲区高速缓存命中率:
selectname,valuefromv$sysstatwherenamein(’dbblockgets’,
‘consistentgets’,'physicalreads’);
HitRatio=1-(physicalreads/(dbblockgets+consistentgets))
3如果日志缓冲区申请的值较大,则应加大LOG_BUFFER参数的值。
日志缓冲区的申请情况:
selectname,valuefromv$sysstatwherename=‘redologspacerequests’;
4如果内存排序命中率小于0.95,则应加大SORT_AREA_SIZE以避免磁盘排序。
内存排序命中率:
selectround((100*b.value)/decode((a.value+b.value),0,1,(a.value+b.value)),2)fromv$sysstata,v$sysstatbwherea.name=’sorts(disk)’andb.name=’sorts(memory)’
5专题五中间件监控
5.1Weblogic
webLogicServer的核心组件由监听线程,套接字复用器和可执行线程的执行队列组成。
当服务器由监听线程接收到连接请求后,将对它的连接控制权交给等待接收请求的套接字复用器。
然后套接字复用器读取离开套接字的请求,并将此请求及相关安全信息或事务处理环境一起置入适当的执行队列中(一般为默认的执行队列)。
当有一个请求出现在执行队列中时,就会有一个空闲的执行线程从该队列中取走发来的该请求,并返回应答,然后等待下一次请求。
因此要提高webLogic的性能,就必须从调整核心组件性能出发。
与webLogic特性相关的技巧有:
使用自动生成主键,webLogic为Oracle和Sqlserver两种数据库的CMP提供了自动生成主键功能,节约了EntityBean产生主键的时间,同时设key-cache-size不小于100;webLogic管理事务性能更好,使用容器管理,而不是Bean管理事务;webLogic提供了为CMP动态查询和批量插入功能,对性能也有很大帮助。
5.2Websphere
5.2.1线程池
线程池使服务器的组件能重用线程以消除在运行时创建新线程的消耗,包括时间和资源。
缺省值:
最小10最大50
建议值:
最小25(Linux)最大50(Unix)
上限:
最大1000
5.2.2数据库连接池
5.2.2.1缺省值
最小连接数1
最大连接数10
连接超时180秒
空闲超时1800秒
孤立超时1800秒
语句高速缓存大小10
自动连接清楚
5.2.2.2连接池大小影响
1最小池大小
较小的池在需求较低时需要较小的开销,因为保持打开的数据库连接较少。
当需求较高时,因为如果池中所有其他的连接都在使用当中,则创建新的连接,所以第一个应用程序经历较慢的响应。
2最大池大小
如果已经达到了最大连接数并且所有连接都在使用中,则其他连接请求会最多等待指定为连接超时的秒数。
最大池大小会影响程序的性能。
较大的池在需求较高时需要更多的开销,因为在需求高峰时有更多的连接打开。
这些连接一直存留,直到空闲而脱离池。
如果最大池较小,则在高峰期会发生更多的等待时间或可能有连接超时错误。
5.2.2.3判断瓶颈方法
当使用TivoliPerformanceViewer工具监控JMS时,某个连接工厂的连接池大小和空闲连接池大小指的是该工厂管理的使用connection数和空闲connection数。
而某个connection的连接池大小和空闲连接池大小指的是该connection管理的活动会话数和空闲会话数。
在WAS管理控制台上看到连接工厂对应2个属性:
连接池和会话池。
连接池的最大连接数表示一个连接工厂内最多可拥有的连接数,会话池的最大连接数表示一个连接内可拥有的最大会话数。
而“JMS连接工厂”节点中显示的连接池和空闲连接池的数值只是下面所有叶子节点的数值之和,本身并没有实际意义。
6专题六调优策略
6.1服务器调优
6.1.1Linux调优基本策略(ulimit)
ulimit-a用来显示当前的各种用户进程限制。
Linux对于每个用户,系统限制其最大进程数。
为提高性能,可以根据设备资源情况,
设置各linux用户的最大进程数,下面我把某linux用户的最大进程数设为10000个:
ulimit-u10000
对于需要做许多socket连接并使它们处于打开状态的Java应用程序而言,
最好通过使用ulimit-nxx修改每个进程可打开的文件数,缺省值是1024。
ulimit-n4096将每个进程可以打开的文件数目加大到4096,缺省为1024
其他建议设置成无限制(unlimited)的一些重要设置是:
数据段长度:
ulimit-dunlimited
最大内存大小:
ulimit-munlimited
堆栈大小:
ulimit-sunlimited
CPU时间:
ulimit-tunlimited
虚拟内存:
ulimit-vunlimited
暂时地,适用于通过ulimit命令登录shell会话期间。
永久地,通过将一个相应的ulimit语句添加到由登录shell读取的文件中,即特定于shell的用户资源文件,如:
1)、解除Linux系统的最大进程数和最大文件打开数限制:
vi/etc/security/limits.conf
#添加如下的行
*softnoproc11000
*hardnoproc11000
*softnofile4100
*hardnofile4100
说明:
*代表针对所有用户
noproc是代表最大进程数
nofile是代表最大文件打开数
2)、让SSH接受Login程式的登入,方便在ssh客户端查看ulimit-a资源限制:
a、vi/etc/ssh/sshd_config
把UserLogin的值改为yes,并把#注释去掉
b、重启sshd服务:
/etc/init.d/sshdrestart
3)、修改所有linux用户的环境变量文件:
vi/etc/profile
ulimit-u10000
ulimit-n4096
ulimit-dunlimited
ulimit-munlimited
ulimit-sunlimited
ulimit-tun