一、测试流程和步骤
1、前言
信息系统的性能是一种指标,表明信息系统对其及时性要求的符合程度。对于一个系统而言,包含并发用户数、响应时间、吞吐量、以及资源利用率等方面的信息。
2、名词解释
- 并发用户数:并发用户数是针对服务端而言,是指在同一时刻与服务端进行交互的在线用户数量。在压力测试期间是并发用户数主要是指同时执行一个或者一系列操作的用户,或者是同时执行脚本的用户,这个并发在设置不同场景的时候并发的情况是不一样的,在实际的测试中需要根据具体的需求进行设计。
- 最大并发用户数:最大并发用户数是指被测服务端所能承载的最多的并发用户,是系统的一个处于过载边界的描述值。主要是描述系统能够提供的最大服务能力。
- 吞吐量:是指单位时间内系统能够处理的请求数量。常用单位时间内系统处理的用户请求数来衡量。对于交互式系统,单位时间是字节数/s、页面数/s或请求数/s,对于非交互系统,单位通常是笔(交易)/s。
- 响应时间:响应时间分为用户响应时间和系统响应时间。用户响应时间是指单个用户所感受到的系统对其交互式操作的响应时间。用户的眼睛存在视觉暂停现象,只能在察觉0.1s以上的视觉变化,用户响应时间在此范围内就可以了。系统响应时间是计算机对用户的输入或请求作出反应的时间。压力测试一般都是站在用户角度考虑问题,因此是用户响应时间。
- 资源利用率:描述信息系统性能能力的一系列数据指标,通常是被测服务器的CPU利用率、内存利用率、磁盘IO、网络吞吐量等。
- 思考时间:信息系统使用者在进行业务操作的时候,发出每个请求之间的时间间隔。
3、压力测试的分类
压力测试是指通过逐渐增加系统负载,测试系统性能的方法和手段。通过压力测试最终确定在什么压力条件下系统性能的表现如何。是一种对于系统提供服务能力的服务能力评估的方法。其主要分为如下几种:
- 1、负载压力测试:是指通过不断地增加系统的压力,观察系统的性能变化,并确定系统满足性能指标要求(这里的性能要求所指一系列指标综合,包含响应时间、CPU利用率、内存使用率、网络吞吐量、磁盘IO等,一般主要决定因素回事响应时间、CPU利用率和内存使用率)的前提下,系统所能承受的最大负载量。
- 2、失效恢复测试:是指针对有系统冗余备份或者负载均衡的系统,模拟系统局部发生故障,系统存在大量用户持续访问的情况下的恢复服务能力的测试。主要是为了评估系统的健壮性和可恢复性。
- 3、疲劳测试:是指在保证总业务了的情况下长时间运行系统的测试(一般模拟 7X24小时或者3X24 小时或者1X24小时的测试周期)
4、压力测试开始的前提条件
压力测试是一种测试评估的方法和手段,因此需要对测试环境、初试压力的规划和计算都有一些经验,由于被测系统的业务逻辑负责度不一样,因此没有一个统一的标准,因此本部分内容仅供参考。
4.1 压测环境的建议
对于被测系统的部署环境一般有如下几点建议:
被测系统的应用服务器和数据持久化服务器最好分开部署,除非生产环境就是在一台服务器上,否则不能部署在一台服务器上。测试压力机和被测系统服务器要部署在同一个子网下,并且要求之间的访问带宽千兆。
被测系统第一次测试压力部署一个最小集合。(例如系统有一个APP服务、一个MySQL服务就可以满足被测系统的完整性,那么就先部署一个APP服务、一个MySQL服务)
4.2 压力测试并发量评估
相信很多人在第一次做压力测试的时候,对并发用户数的选择一直有很多的疑惑,那么下面介绍一些行业内的通用的计算方法,但是这些方法也不是绝对的方法,这些仅仅是压力测试并发用户数的一种计算方法,但是最后是不是n的并发就可以支持m级别的用户也是由被测系统逻辑复杂的决定的。但是可以用如下的一种方法确定初始开发压力测试的并发用户数。
4.2.1 计算方法1️:
代码语言:javascript复制1)平均并发用户数为 C = nL/T
2)并发用户数峰值 C‘ = C 三次根号C
其中C是平均并发用户数,n是login session的数量,L是login session的平均长度,T是值考察的时间长度
C’是并发用户数峰值
例1,假设系统A,该系统有3000个用户,平均每天大概有400个用户要访问该系统(可以从系统日志从获得),对于一个典型用户来说,一天之内用户从登陆到退出的平均时间为4小时,而在一天之内,用户只有在8小时之内会使用该系统。
计算结果:
代码语言:javascript复制 平均并发用户数为:C = 400*4/8 = 200
并发用户数峰值为:C‘ = 243
例2, 某公司为其170000名员工设计了一个薪酬系统,员工可进入该系统查询自己的薪酬信息,但并不是每个人都会用这个系统,假设只有50%的人会定期用该系统,这些人里面有70%是在每个月的最后一周使用一次该系统,且平均使用系统时间为5分钟。
计算结果:
代码语言:javascript复制 则一个月最后一周的平均并发用户数为(朝九晚五):
n = 170000*0.5*0.7/5 = 11900;
C= 11900*5/60/8 = 124
C'=129
4.2.2 计算方法2:
对绝大多数场景,我们用(用户总量/统计时间)影响因子(一般为3)来进行估算并发量。 比如,以乘坐地铁为例子,每天乘坐人数为5万人次,每天早高峰是7到9点,晚高峰是6到7点,根据8/2原则,80%的乘客会在高峰期间乘坐地铁,则每秒到达地铁检票口的人数为5000080%/(36060)=3.7,约4人/S,考虑到安检,入口关闭等因素,实际堆积在检票口的人数肯定比这个要大,假定每个人需要3秒才能进站,那实际并发应为4人/s*3s=12,当然影响因子可以根据实际情况增大!
代码语言:javascript复制C=12
4.2.3 计算方法3:
比如一个网站,每天的PV大概1000w,根据2/8原则,我们可以认为这1000w pv的80%是在一天的9个小时内完成的(人的精力有限),那么TPS为:1000w80%/(93600)=246.92个/s,取经验因子3,则并发量应为:
代码语言:javascript复制C=246.92*3=740
4.2.4 计算方法4:
C = 系统最大在线用户数的8%到12%
4.2.5 计算方法5:
C=(Think time 1)*TPS
5、压力测试流程及工具推荐
5.1 第一阶段:压力测试和资源特性
按照上述的某一种估算,开始压力通过发压力工具发压(推荐LoadRunner、Jmeter一种工具即可)
监控服务器资源特性,推荐使用LoadRunner、Jmeter自带的监控,如果都不熟悉推荐nmon
通过上述两个部分结果综合分析压力测试结果
如果发现资源消耗在外部接口上,那么推荐系统解耦合。这里推荐使用TestDouble服务
5.2 第二阶段:故障诊断
如果第一阶段压力测试过程中发现有服务性能问题(一般都是通过监控资、响应时间、QPS、TPS、HPS,判断。具体没有一个统一标准,后续会逐渐将问题特征汇总收集),那么就要引入故障诊断工具。故障诊断工具推荐一块yourkit 0X00106 Yourkit 故障诊断工具使用。
代码语言:javascript复制按照第一阶段内容全部就绪
配置好yourkit的监控,在测试过程收集服务端信息
通过上述所有的结果综合分析故障
5.3 第三阶段:最小计算单元划分以及算力扩容方案制定
压力测试完成后并不是压力测试就结束了,压力测试是一种解决故障、评估服务计算能力的手段。通过最小计算单元的规划,评估最小计算单元的服务计算力。在后续如果性能出现问题,设定好快速扩容方案(但是这些都是在已经没有性能问题的情况下),这部分有可能需要被测系统有session共享、会话保持、数据库代理等能力。
6、疲劳测试
6.1 混合场景
疲劳测试一般都是通过混合场景测试出来的,所谓混合场景就是在大并发的情况下,包含了各种各样的逻辑操作。例如:1000的并发,有800个人在登录后首页访问,100个人在登陆后查询,80个人在登陆后新增,20个人在登录后修改。那么建立一种这样混合脚本的测试场景,更大的模拟被测系统的最大压力时候的用户使用行为。
6.2 疲劳测试策略设定
疲劳测试的策略一般推荐7X24小时的测试,但是由于项目工期或者是系统忙闲周期明显,可以测试3X24小时或者1X24小时,具体选择要按照服务受众用户群体的行为逻辑评估。
Linux Loadrunner Generator的安装
由于LoadRunner并不提供Linux的控制台,这无疑给一些在服务端做压力测试制造了一些麻烦。但是LoadRunner提供了Linux的压力机代理,这样我们可以通过Windows的控制台链接LInux的压力机,通过Linux发压力。Linux的压力机单台提供压力的能力是远远大于windows的压力机的
1 Linux Loadrunner Generator
1.1 安装
安装包
代码语言:javascript复制 上传Linux.zip
unzip Linux.zip
chmod -R 777 Linux
cd Linux
sh installer.sh
然后一路下去
添加一个用户
代码语言:javascript复制 useradd -g 0 test
或者
useradd -g 0 -s /bin/csh test
1.2 配置
设置环境变量(bsh)
代码语言:javascript复制vim /opt/HP/HP_LoadGenerator/env.sh
内容:
代码语言:javascript复制#!/bin/bsh
export PRODUCT_DIR="/opt/HP/HP_LoadGenerator"
export M_LROOT="/opt/HP/HP_LoadGenerator"
export LD_LIBRARY_PATH=$M_LROOT/bin:$M_LROOT/lib:/usr/lib
export DISPLAY='0.0'
export PATH=$PATH:${M_LROOT}/bin
修改该文件的使用属性
代码语言:javascript复制chmod 777 env.sh
在环境变量中使用该文件,在/etc/profile 和/etc/bashrc 最后加入:
代码语言:javascript复制source /opt/HP/HP_LoadGenerator/env.sh
用户重新登陆,检查环境变量是否生效
代码语言:javascript复制echo $PRODUCT_DIR
echo $M_LROOT
echo $LD_LIBRARY_PATH
echo $PATH
1.3 检查
执行
代码语言:javascript复制./opt/HP/HP_LoadGenerator/bin/verify_generator
全部ok表示已经安装成功
1.4 启动
代码语言:javascript复制./mdaemonsetup start
2 问题
Q0:Not all extension Dlls were loaded
安装完成后,在/opt/HP/HP_LoadGenerator/bin下所有目录及子目录均属于非root用户及非root用户组。如果出现文件夹为root用户组,文件为bin用户,则也会出现Not all extension Dlls were loaded的问题,需要重新安装。
Q1:-bash: ./magentdaemon: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
是因为64位系统中安装了32位程序
解决方法:
代码语言:javascript复制yum install glibc.i686
Q2:error while loading shared libraries: libstdc .so.5: cannot open shared object file: No such file or directory
解决办法
代码语言:javascript复制yum whatprovides libstdc .so.5
yum install compat-libstdc -33-3.2.3-72.el7.i686
Q3:${M_LROOT}找不到
解决办法
代码语言:javascript复制M_LROOT变量找不到的问题修改:
/opt/HP/HP_LoadGenerator/bin/lrv/ vusrchk中288行,将unset M_LROOT下移到289行后面
Q4:找不到${LDLIBRARYPATH}
解决LDLIBRARYPATH找不到的问题:将/opt/HP/HP_LoadGenerator/bin/lrv/vusrchk中356行,改成357行内容。
代码语言:javascript复制SunOS|Linux
#temp=`$my_shell -c ' echo MERCURY $LD_LIBRARY_PATH ' 2> /dev/null`
temp=`$my_shell -c ' echo MERCURY ${M_LROOT}/bin ' 2> /dev/null`
;;
esac
Q5:找不到libdriver.so
首先find出libdriver.so位置,看看有没有
修改/opt/HP/HPLoadGenerator/bin/lrv/vusrchk,在483行处再加入一次这个lib的路径:export LDLIBRARYPATH=
{MLROOT}/bin
代码语言:javascript复制else
echo "OK $trail"
fi
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/${M_LROOT}/bin
echo $ECHO_N "Verify running the product executables...$ECHO_C"
rm -f /tmp/verify_mdrv_err.txt
Linux的Jmeter使用
Jmeter是需要JDK的运行环境,因此需要先在Linux安装JDK,然后配置环境变量,本部分略过。
代码语言:javascript复制http://archive.apache.org/dist/jmeter/binaries/
下载对应的jmeter版本。
安装
将jmeter上传到服务器上(如果没有远程shell,建议使用MobaXterm),然后运行如下命令:
代码语言:javascript复制unzip apache-jmeter-3.0_json.zip
cp -r jmeter-3.0 /usr/local/jmeter-3.0
配置
然后配置环境变量,如下:
代码语言:javascript复制vi /etc/profile
进入编辑模式
代码语言:javascript复制export JMETER_HOME=/usr/local/jmeter-3.0
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH
保存后,source /etc/profile (让配置文件立马生效),然后通过
代码语言:javascript复制jmeter -v
检查配置是否生效。
使用 将本地生成的jmx文件上传到服务器 输入命令:
代码语言:javascript复制# jmeter -n -t /home/jessica/httpThread.jmx -l log.jtl
nmon监控Linux服务器资源特性
nmon就可以完全满足上述需求。一个小巧轻便的监控工具,同时提供结果分析工具。好了那让我们一起看看他怎么用。
如何部署
下载安装
下载地址:http://nmon.sourceforge.net/pmwiki.php?n=Site.Download
进入后,选择你需要的版本。一般我们都会选择x86的包,我们看到安装包还有power架构的源码包,这些是有CPU的架构决定的。
CPU架构分类:1、IBM 的 PowerPC架构(Power G4、G5、G6、PowerXCell) 2、MIPS 的 MIPS架构(多家厂商,包括AMD也获授权生产,龙芯也是MIPS变种) 3、SUN 的 UltraSPARC架构(UltraSPARC III、IV、VI、T1、T2) 4、DEC 的 Alpha架构(现今少见,DEC被Compaq收购,Compaq又被HP收购) 5、Acorn的 ARM架构 6、Intel和HP 的 EPIC架构(Iantium、Iantium2),这也就是 IA64 架构。还有IA32,其中IA64就是我们常说的X86_64,IA32就是我们常说的X86
后续的例子我们以下载X86_64为例,因此我们下载了如下图的包:
进入shell客户端,下载安装包并解压:
代码语言:javascript复制一般会通过如下方法在本地新建一个放置安装包的目录 cd/home mkdir mr_tester cd mr_tester
wget http://sourceforge.net/projects/nmon/files/nmon16e_mpginc.tar.gz
tar zxvf nmon16e_mpginc.tar.gz
mkdir /usr/local/bin/nmon/
cp -r * /usr/local/bin/nmon/
cd /usr/local/bin/
chmod 777 nmon
cd nmon
#下面运行那个工具,要看具体操作系统版本而定
./nmon_x86_64_centos6
就可以看到如下的界面了。
输入c可显示CPU的信息,“m”对应内存,“n”对应网络,“d”可以查看磁盘信息,“t”可以查看系统的进程信息,具体参数在工具的主页面下半部分有详细介绍这里不做累述。
服务器资源的收集
为了方便建议将nmon作如下软链的操作:
代码语言:javascript复制cp/usr/local/bin/nmon/nmon_x86_64_centos6/usr/bin/nmon
但是在真实的测试过程中,我们有可能需要某一段时间里面的服务器资源的情况,因此我们需要对服务器资源进行采集。nmon是支持这样的需求的,首先我们看一个小例子:
代码语言:javascript复制nmon -s 1 -c 10 -s 4 -f -m /home
上面命令参数的含义是:
代码语言:javascript复制-s :每隔n秒抽样一次,这里为1秒
-c :取出多少个抽样数量,这里为10,即监控=10*1秒=10秒
-f :按标准格式输出文件名称:<hostname>_YYYYMMDD_HHMM.nmon
-m :结果输出路径
其他命令:输入nmon后,进入nmon的页面,输入-h就可以看到全部帮助了
利用excel工具作分析
nmon有一个非常踊跃的excel的分析工具,是有IBM提供。下载地址如下:https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Power Systems/page/nmon_analyser
下载下面的文件。
下载后,有一个word和一个excel,其中excel是工具,word是使用手册。
在linux下载生成的结果,双击打开图表工具 excel的工具文件打开 :
然后点击上面的Analyze nmon data” 按钮后,选择服务器的记录文件,如果按钮点击无效,如下图所示允许允许宏。
选择刚刚的导出来的linux的记录就可以看到图形化的linux资源占用分析了。
LoadRunner监控Linux资源
rstat协议允许网络上的用户获得同一网络上各机器的性能参数。
0、需要下载3个包:
代码语言:javascript复制 (1)rsh-0.17-14.i386.rpm
(2)rsh-server-0.17-14.i386.rpm
(3)rpc.rstatd-4.0.1.tar.gz
1、安装rsh
查看是否安装并卸载rsh
代码语言:javascript复制[root@localhost /]# rpm -qa |grep rsh --查看是否安装rsh
[root@localhost /]# rpm -e 版本号 --卸载该版本
安装rsh,rsh-server
代码语言:javascript复制[root@localhost /]# rpm -ivh rsh-0.17-14.i386.rpm
[root@localhost /]# rpm -ivh rsh-server-0.17-14.i386.rpm
或[root@localhost /]#yum -y install rsh*
2、安装rstatd
下载并安装rstatd,下载地址:http://sourceforge.net/projects/rstatd,上传至/usr/local
查看是否安装,一般来说Linux都没有安装
代码语言:javascript复制[root@localhost /]# find / -name rpc.rstatd
安装rstatd
代码语言:javascript复制[root@localhost /]# tar -xzvf rpc.rstatd-4.0.1.tar.gz
[root@localhost /]# cd rpc.rstatd-4.0.1
[root@localhost /]# ./configure
[root@localhost /]# make
[root@localhost /]# make install
3、安装完成后配置rstatd目标守护进程xinetd,配置文件于/etc/xinet.d目录下
修改/etc/xinetd.d目录下面的3个conf(rogin,rsh,rexec)中的disable均设置为no
代码语言:javascript复制[root@localhost /]# cd /etc/xinetd.d --进入到/etc/xinetd.conf目录中
[root@localhost /]# vi rlogin --编辑disable=no,保存
[root@localhost /]# vi rsh --编辑disable=no,保存
[root@localhost /]# vi rexec --编辑disable=no,保存
4、启动rpc.rstatd
代码语言:javascript复制[root@localhost /]# rpc.rstatd --启动rpc.rstatd进程
[root@localhost /]# rpcinfo -p --执行此命令检查rpc服务的状态
如果未出现上图的rstatd说明没有安装成功,需要重复以上步骤。
到这里为止,LR监控Linux必要的服务都已安装好了。
5、关闭防火墙
代码语言:javascript复制[root@localhost /]# service iptables stop
6、利用LR中的Controller监控Linux资源
在Controller中,将System Resource Graphs中的Unix resources拖到右侧的资源监控区域。鼠标右键选择Add Measurements,添加被监控Linux的IP地址x.x.x.x,选择需要监控的性能指标,确认。
注意:监控过程中要关闭Linux防火墙,否则可能会监控失败
7、遇到的问题
1. LoadRunner监控Linux资源时弹出如下错误:
Monitor name :UNIX Resources. Cannot initialize the monitoring on 192.168.52.189. Error while creating the RPC client. Ensure that the machine can be connected and that it runs the rstat daemon (use rpcinfo utility for this verification). Detailed error: RPC: Failed to create RPC client. RPC-TCP: Failed to establish RPC server address.
原因:Linux系统中没有安装rpc.rstatd,服务未开启的原因造成的。
解决办法:照上述方法安装rpc.rstatd并开启即可监控Linux.
2. configure: error: no acceptable C compiler found in $PATH
原因:未安装gcc编译器. 在命令行里敲入gcc –v, 如果提示command not found 就表示你的系统里没有安装gcc编译器
解决办法:yum install gcc
Jmeter监控linux环境
重点:本地Jmeter版本和插件支持版本要对应)
一、插件下载地址
1、本地插件:
代码语言:javascript复制https://jmeter-plugins.org/downloads/old/
下载解压,放到本地jmeter目录:
/Users/wuxi/Documents/apache-jmeter-3.2/lib/ext/
2、服务端需要插件:
代码语言:javascript复制https://jmeter-plugins.org/wiki/PerfMonAgent/
PerfMon Metrics Collector使用文档:
代码语言:javascript复制https://jmeter-plugins.org/wiki/PerfMon/
安装unzip:
代码语言:javascript复制yum install zip unzip
再次安装:
代码语言:javascript复制unzip ServerAgent-2.2.1.zip
执行:
代码语言:javascript复制sudo chmod 777 startAgent.sh
./startAgent.sh
查看端口:lsof -i:4444 又占用进程表示服务启动
Yourkit 故障诊断工具使用
PS:stand-alone模式的jetty为例
1、服务器端下载yourkit(java)
Windows安装yourkit Java Profiler 2014, 在工具中get free license就可以了。
Linux 下载linux版本的youkit(如果下载失效,请登录官网选择对应的版本下载
https://www.yourkit.com/java/profiler/download/)
代码语言:javascript复制Wget https://www.yourkit.com/download/yjp-2015-build-15046-linux.tar.bz2
tar xfj yjp.tar.bz2
2、 yourkit启动方式
将下载的安装包(yjp-2014-build-14116-linux.tar.bz2)通过FTP上传至服务器,并解压
代码语言:javascript复制cd /home/
mv yjp-2014-build-14116-linux.tar.bz2 yjp.tar.bz2
tar xfj yjp.tar.bz2
启动Jetty,YourKit会在10001-10010之间取可用的端口作为远程监听端口,查看启动端口,可以通过:
代码语言:javascript复制cd /home/yjp/bin
sh yjp.sh -attach
开启后结果:(如果有多个java进程,请选择正确的pid)
防火墙开放远程监听端口,否则YourKit无法远程连接:
代码语言:javascript复制/sbin/iptables -I INPUT -p tcp --dport 10001 -j ACCEPT //写入修改
/etc/init.d/iptables save //保存修改
service iptables restart//重启防火墙,修改生效
启动开发机YourKit,在欢迎界面找到”Connect to remote application”点开输入host:port,就可以远程连接上服务端。