最近根据公司工做的需求,学习了一些压力测试的知识,目前,公司使用的是jmeter进行压力测试。下面就记录下近期的学习。java
我想将此次的博文分红三个部分:linux
一、开始测试前的准备(测试环境的搭建)shell
二、在一台linux上测试apache
三、多台linux分布式测试windows
首先来看看测试环境的搭建。我是本身建立的linux虚拟机,因此就用它来讲说吧。bash
安装linux的过程就很少说了,不是本次的重点,有不太明白的朋友,能够本身去百度下,或者我有一篇文章也大概记录了个人安装过程,能够参考下。服务器
linux安装好以后,咱们须要安装jdk,由于jmeter是依赖于jdk运行的。因为咱们的测试case都是在windows上利用jmeter写好以后上传到linux上跑的,因此,为了不没必要要的错误,windows和linux的jdk和jmeter版本要保持一致。网络
JDK的安装并发
找到本身想要的版本,在linux的/usr/下新建一个文件夹,名字本身取,用来放jdk安装包和安装jdk使用(我使用的是/usr/java/)。而后将安装包放到linux的/usr/java/下,而后执行下面命令进行jdk的安装:负载均衡
tar -zxf <jdk name>
jdk name 就是你要安装的jdk安装包,至此,jdk安装就完成了。为了节省空间,咱们要把安装包删掉,执行下面的命令:
rm -f <jdk name>
-f 指明了不须要询问我,直接删掉。
接下来,咱们须要配置系统变量,就像windows操做系统中配置环境变量同样,这里咱们经过编辑profile文件来配置:
vi /etc/profile
而后按下Ins键,当下面出现INSERT时,咱们就能够进行编辑了。
在文件的后面追加下面几行内容:
JAVA_HOME=/usr/java/jdk1.8.0_121
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH
内容中的路径和jdk版本都要换成本身的,这个是笔者的路径。
添加完以后,按下Esc键,退出编辑模式,而后输入:wq 再按下回车键,这样就将修改的内容保存并退出,为了让修改的文件生效,须要执行下面的命令:
source /etc/profile
为了验证jdk是否成功安装,咱们执行下面的命令,若是出现对应的安装版本信息,则说明安装成功,不然请检查安装和配置。
[root@localhost java]# java -version java version "1.8.0_121"
Jmeter的安装
jdk安装完成,就开始jmeter的安装了。安装过程很简单,跟jdk相似,如今/etc/下建立jmeter文件夹,将安装包放到/usr/jmeter/下,执行下面命令:
tar -zxf <jmeter package>
安装好之后,去配置环境变量。依然是修改/etc/profile的内容。添加如下几行:
JMETER_HOME=/usr/jmeter/apache-jmeter-3.0
CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar:$CLASSPATH
PATH=$JMETER_HOME/bin/:$PATH
export JMETER_HOME CLASSPATH PATH
必定要注意,路径要换成本身的哦。至此,jmeter也已经安装完毕啦,咱们能够执行如下命令要验证,jmeter是否安装成功。
jmeter -v
若是正确的安装,就会出现jmeter的版本相关信息。
执行一条jmeter测试
相信到这里的朋友,测试环境已经搭建好了。那么接下来呢,咱们就能够开始执行第一条测试了。
首先,建立一个文件夹来放测试case,由于我是用虚拟机跟本地windows机器建立了一个共享文件夹,因此为了方便,我就直接放在该文件夹下了。(/mnt/hgfs/share/jmeterTest)
而后能够运行下面的命令:
jmeter -n -t test.jmx -l testReport.jtl
jmeter前面咱们已经安装,jmeter在安装路径的bin目录下。
-n 表示没有界面的运行
-t 后面紧跟指定的须要运行的测试case(测试case在windows上用jmeter图形界面事先写好)
-l 指定了测试报告的文件(也能够指定路径,默认在当前目录下),生成的报告能够保存到本地windows上在jmeter中打开查看。
须要注意的是:咱们的操做是在root身份下进行的,若是你登录的是其余身份的用户,可能jmeter不具备x(可执行)权限,咱们须要先给它权限。
至此,在linux上经过命令行执行jmeter测试已经成功完成了。可是,对于一个有点儿追求的测试狗来讲,这确定是远远不够的。下面咱们就来讲下,如何在多台linux上分布式执行jmeter测试。
多台linux分布式测试
先来理解下分布式测试原理,看下图:
一、Jmeter分布式测试时,选择其中一台做为调度机(master/Controller),其它机器作为执行机(slave/Agent)。
二、执行时,master会把脚本发送到每台slave上,slave 拿到脚本后就开始执行,slave执行时不须要启动GUI,应该是经过命令行模式执行的。
三、执行完成后,slave会把结果回传给master,master会收集全部slave的信息并汇总。
注意:
(1)每一台jmeter远程服务器(slave机器)都执行相同的测试计划,jmeter不会在执行期间作负载均衡,每一台服务器都会完整地运行测试计划;
(2)采用JMeter远程模式并不会比独立运行相同数目的非GUI 测试更耗费资源。可是,若是使用大量的JMeter 远程服务器,可能会致使客户端过载,或者网络链接发生拥塞;
(3)默认状况下,master机器是不执行参与生成并发数据的;
(4)调度机(master)和执行机(slave)最好分开,因为master须要发送信息给slave而且会接收slave回传回来的测试数据,因此mater自身会有消耗,因此建议单独用一台机器做为mater。
下面开始实施吧。
首先,按照前面安装jmeter的步骤,在其余linux上安装jdk和jmeter(jdk和jmeter的版本以及安装路径要保持一致,否则可能会出错,没法成功执行)
确保环境搭建完成之后,进入jmeter的安装目录,进入bin下,启动jmeter-server(若是没有可执行权限,要先添加权限,root用户没有权限限制)
全部的slave机器都要启动jmeter-server,默认端口是1099,能够经过修改jmeter.properties文件进行修改。回到master机器上,修改jmeter.properties文件中的remote_hosts,将slave机器的ip地址添加上去,多个ip之间用逗号隔开。其中127.0.0.1表示master机器自己,为了独立开master,能够将其去掉,这样就不会在master上执行测试。
而后在master机器上执行下面的命令:
jmeter -n -t test.jmx -R ip1,ip2,ip3 -l testReport.jtl
其中 -R 指定远程链接的slave机器的ip地址,多个ip之间用逗号隔开。
至此,分布式jmeter测试也完成了。可是,对,我又要说可是了。颇有可能你不会执行成功(由于我就没有那么容易的成功啊!哈哈哈)
那么问题来了
下面我列举出一些我在这个过程当中出现的一些错误,以及后来的解决办法。
问题1:
在slava机器上执行jmeter-server的时候,会出现如下的问题:(如下为本人遇到的问题)
一、出现 XII DISPLAY 这样的错误,能够先执行下面命令:
echo $DISPLAY
若是内容为空(我就是内容为空),那么,就继续执行下面的命令:
DISPLAY=:0 #DISPLAY=localhost:0.0
上面两个均可以
问题2:
jmeter-server启动失败。一般有如下两个错误:
一、Unable to get local host IP address
二、xxx is a loopback address
通常上面的两个问题,都是由host文件引发的,咱们须要修改host文件,能够执行下面的命令:
vi /etc/hosts
我是将127.0.0.1替换成本机ip地址的。
针对“xxx is a loopback address”这个问题,咱们还能够经过执行下面的命令来指定ip,从而避免掉该错误:
./jmeter-server -Djava.rmi.server.hostname=ip
问题3:
jmeter-server启动成功,可是在master上没法执行分布式测试。
我这边抛出的错误是:”No route to host“
这个问题是由防火墙引发的,也就是说,slave上的防火墙没有关闭,此时,咱们须要到slave上关掉防火墙。以后就能够正常运行了。关闭防火墙的方法多种,我这里特别记录下我本身红帽子7虚拟机的命令:
#查看防火墙状态 systemctl status firewalld #关闭防火墙 systemctl stop firewalld
好了,整个过程就是这样的额。
偷偷告诉大家一个事情,由于我是个“懒癌患者”,因此上面这些执行测试的操做,都不要重复去作,因而我就想方法将他们写到了一个shell文件中,下次再跟你们一块儿分享下这个小脚本,但愿大神给我指点!!!!
谢谢你们看完本博。喜欢就点个赞吧,转载请注明出处!