博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

CentOS使用JMeter压力测试

Posted on 2020-07-16 12:41  龙翔天下  阅读(2170)  评论(0编辑  收藏  举报

1、安装java8:

通过网址下载:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

 

我下载的是RMP安装包。

 

 

 下载后改名:

 

 

 安装:

 

 

 配置环境变量:

 

 

 在内容末尾加上:

JAVA_HOME=/usr/java/latest
CLASSPATH=%JAVA_HOME%/lib:%JAVA_HOME%/jre/lib
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export PATH CLASSPATH JAVA_HOME

 

编辑好后,使环境变量生效:

source /etc/profile

 

 

 以上路径可以在以下检查安装软件的位置可以查到:

 

 2、使用jemter

去下载:https://jmeter.apache.org/download_jmeter.cgi

下载:

wget https://mirrors.bfsu.edu.cn/apache//jmeter/binaries/apache-jmeter-5.3.tgz

 

解压:

tar -xvf apache-jmeter-5.3.tgz

 

 

用cli模式运行并加载测试模板,最后生成html报告:

 cd apache-jmeter-5.3.tgz && bin/jmeter -n -t Test\ Plan.jmx -l result.jtl -e -o ./html

 参数:

# -n:以非GUI形式运行Jmeter 
# -t:运行JMX测试计划脚本文件的路径 
# -l:运行结果保存路径(.jtl),此文件必须不存在
# -j: jmeter运行日志
# -r: 运行分布式压测服务器,指明用jmeter属性"remote_hosts"
# -R:运行分布式服务器,其后跟着服务器列表 # -e:在脚本运行结束后生成html报告,此参数要与-l一起使用。 # -o:用于存放html报告的目录,此目录必须为空。此参数与-e一起使用。

测试模板请在本机window下运行jmeter GUI来生成,保存后再上传到测试服务器上。

------------恢复内容开始------------

1、安装java8:

通过网址下载:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

 

我下载的是RMP安装包。

 

 

 下载后改名:

 

 

 安装:

 

 

 配置环境变量:

 

 

 在内容末尾加上:

JAVA_HOME=/usr/java/latest
CLASSPATH=%JAVA_HOME%/lib:%JAVA_HOME%/jre/lib
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export PATH CLASSPATH JAVA_HOME

 

编辑好后,使环境变量生效:

source /etc/profile

 

 

 以上路径可以在以下检查安装软件的位置可以查到:

 

 2、使用jemter

去下载:https://jmeter.apache.org/download_jmeter.cgi

下载:

wget https://mirrors.bfsu.edu.cn/apache//jmeter/binaries/apache-jmeter-5.3.tgz

 

解压:

tar -xvf apache-jmeter-5.3.tgz

 

 

用cli模式运行并加载测试模板,最后生成html报告:

 cd apache-jmeter-5.3.tgz && bin/jmeter -n -t Test\ Plan.jmx -l result.jtl -e -o ./html

 参数:

# -n:以非GUI形式运行Jmeter 
# -t:运行JMX测试计划脚本文件的路径 
# -l:运行结果保存路径(.jtl),此文件必须不存在
# -j: jmeter运行日志
# -r: 运行分布式压测服务器,指明用jmeter属性"remote_hosts"
# -R:运行分布式服务器,其后跟着服务器列表 # -e:在脚本运行结束后生成html报告,此参数要与-l一起使用。 # -o:用于存放html报告的目录,此目录必须为空。此参数与-e一起使用。

测试模板请在本机window下运行jmeter GUI来生成,保存后再上传到测试服务器上。
而实际测试建议使用CLI模式下运行。


3、压测中的线程属性说明

 

线程数:指测试时要发起压测的线程数量,相当于模拟访问用户数。如果是分布式压力测试,则每台压测服务器都会按这个数量产生线程,而不是整个测试的总线程数。

Ramp-Up时间:所有线程创建完成所需的时间,以上方30秒设置为例,则30秒时间产生10000个线程,每秒则产生10000/30 = 约 999 条线程;

循环次数:每个线程循环执行的次数,勾选“永远”则表示不限次数地循环执行,一直到下方的“持续时间”结束为止,如果所有线程循环完预定的次数,则当前测试就会停止了,就算下方的“持续时间”到了实际测试也已经是完成了。

持续时间(秒):当勾选“调度器”时,表示整个测试要持续执行的时间。实际测试时并非完全遵循此时间结束,如果上方的“循环次数”设置一个数值时,就算已经在测试时已经过了设定的持续时间,如果线程未循环完预定的循环次数,仍然会循环执行完为止。

启动延迟(秒):测试开始时需延迟多少秒才开始。

“same user on each iteration":表示每次循环是否使用同一用户(即同一线程)执行,这对于web测试是否需要保持同一会话时有用;

”延迟创建线程直到需要“:如选项如果勾选,则在Ramp-Up时间结束后等所有线程都启动完毕才开始执行测试,如果Ramp-Up时间未结束时,已创建的线程则在等待状态,并未开始执行测试。实际测试中,此选项几乎不会影响测试结果 。

 

4、分布式测试

由于单台压测服务器并不足以进行创建过多线程时,则可以使用分布式测试。将所有测试线程都由各台压测服务器同时产生,并将测试结果返回到控制服务器。控制服务器与压测服务器可以是同一台服器。

要求:

1、压测服务器、控制服务器、被测试服务器要在同一内网;

2、压测服务器、控制服务器安装的java版本一致;

3、压测服务器、控制服务器运行的jmeter版本一致;

 

压测服务器、控制服务器的jmeter的SSL设置:

所有压测服务器与控制服务器的通讯,默认以ssl证书通讯。

可以在控制服务器中使用./create-rmi-keystore.sh 命令(jmeter软件中附带)产生.jks后缀名的证书,将此证书存放到各压测服务器的jmeter软件的bin目录下。

个人不太建议使用SSL证书通讯方式,本人实际测试时,在1099端口开放并未占用的正常情况下,压测服务器并未收到控制服务器的测试指令的问题,用telnet测试却是端口并无问题。。

所以个人建议在jmeter.properties配置文件中,关闭SSL选项:

server.rmi.ssl.disable=true

注意,每台压测服务器和控制服务器都要修改此选项。这样就不需要SSL证书了。

 

在每台压测服务器上运行压测服务:

./jmeter-server -Djava.rmi.server.hostname=内网IP

示例:

 

在控制服务器上,设置压测服务器IP。打开jmeter.properties文件,修改remote_hosts配置值:

 

 多台压测服务器之间用逗号相隔。1099是默认通讯端口,可省略写入。如果压测服务器的侦测端口已修改,则必须写上端口。

 

测试端口是否被占用:

netstat -tunlp |grep 1099

 

 一切准备就绪。在控制器启动测试:

./jmeter -n -t ./Test_Plan.jmx -r -l ./result.jtl -e -o ./html

Test_Plan.jmx是测试计划文件, result.jtl是测试结果文件。

 

 

一些问题总结:

(1)如果遇到 open too many files,说明遇到打开文件最大值问题。可进行如下设置:

echo "ulimit -HSn 65536" >> /etc/rc.local

echo "ulimit -HSn 65536" >> /root/.bash_profile

ulimit -HSn 65536

(2)如果遇到out of memory异常,则增大JVM内存池。编辑jmeter文件,找到:

 

增加内存池大小,如:

 

(3) 如果测试过程中需要停止测试,正常情况下可以使用./stoptest.sh(window: stoptest.cmd)停止。如果某些异常导致无法正常停止,则直接kill掉测试进程。

 

其他:

检查TCP/IP连接状态和对应个数:

netstat -an | awk '/^tcp/ {++s[$NF]} END {for(a in s) print a, s[a]}'

 

 

参考:

https://blog.csdn.net/qq_41907450/article/details/84143601

https://blog.csdn.net/chenlin465373800/article/details/78924780