jmeter性能测试实战——基础篇

目录:

一、下载jmeter安装包

官网下载:https://jmeter.apache.org/download_jmeter.cgi

  1. 配置插件:plugins manager 【参考网站:https://jmeter-plugins.org/install/Install/】
  2. 把jar包放入你的JMeter根目录下的 lib/ext 目录
  3. 运行jmeter,在选项中即可看到插件管理工具

二、分布式环境部署前准备

【打开bin目录下jmeter.properties】

1. 找到下行代码,修改fales为true同时取消注释(#)

【jmeter分布式存在ssl加密连接,关闭连接后可以不用在创建秘钥,详见:https://jmeter.apache.org/usermanual/remote-test.html#setup_ssl】

# server.rmi.ssl.disable=fales

修改后如下

server.rmi.ssl.disable=true

如果没有修改该项,slaves运行分布式服务时会出现报错

[root@localhost bin]# ./jmeter-server

Server failed to start: java.rmi.server.ExportException: Listen failed on port: 0; nested exception is:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
An error occurred: Listen failed on port: 0; nested exception is:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)

2. 修改输出报告仪表盘的文本,修改为以下样式:

如果想要一个漂亮的图表数据展示的话,需要用到以下方式,当然运行的话需要在命令模式下进行:

打开配置文件,以下数据可以直接覆盖原数据:
[root@localhost bin]# vim jmeter.properties 
# This section helps determine how result data will be saved.
# The commented out values are the defaults.

# legitimate values: xml, csv, db.  Only xml and csv are currently supported.
jmeter.save.saveservice.output_format=csv

# The below properties are true when field should be saved; false otherwise
#
# assertion_results_failure_message only affects CSV output
jmeter.save.saveservice.assertion_results_failure_message=true
#
# legitimate values: none, first, all
#jmeter.save.saveservice.assertion_results=all
#
jmeter.save.saveservice.data_type=true
jmeter.save.saveservice.label=true
jmeter.save.saveservice.response_code=true
# response_data is not currently supported for CSV output
jmeter.save.saveservice.response_data=true
# Save ResponseData for failed samples
jmeter.save.saveservice.response_data.on_error=true
jmeter.save.saveservice.response_message=true
jmeter.save.saveservice.successful=true
jmeter.save.saveservice.thread_name=true
jmeter.save.saveservice.time=true
jmeter.save.saveservice.subresults=true
jmeter.save.saveservice.assertions=true
jmeter.save.saveservice.latency=true
# Only available with HttpClient4
jmeter.save.saveservice.connect_time=true
jmeter.save.saveservice.samplerData=true
jmeter.save.saveservice.responseHeaders=true
jmeter.save.saveservice.requestHeaders=true
jmeter.save.saveservice.encoding=true
jmeter.save.saveservice.bytes=true
# Only available with HttpClient4
#jmeter.save.saveservice.sent_bytes=true
jmeter.save.saveservice.url=true
jmeter.save.saveservice.filename=true
jmeter.save.saveservice.hostname=true
jmeter.save.saveservice.thread_counts=true
jmeter.save.saveservice.sample_count=true
jmeter.save.saveservice.idle_time=true

# Timestamp format - this only affects CSV output files
# legitimate values: none, ms, or a format suitable for SimpleDateFormat
jmeter.save.saveservice.timestamp_format=ms
jmeter.save.saveservice.timestamp_format=yyyy/MM/dd HH:mm:ss.SSS

3. 分布式环境的话在master需要将slaves的ip地址输入

remote_hosts=127.0.0.1     #原始文本,master不建议施加压力,因为调用slaves会占用端口。

4. 端口不建议做修改

在运行slaves上运行jmeter-server时会存在端口问题,第一次运行报错后需要检查端口1099是否被占用,可用

netstat -tunlp |grep 1099

查看,也可以用

ps aux | grep jmeter-server

查看正在运行中的server,如存在全部 kill -9 杀掉。
快速杀死jmeter-server后台程序命令:

添加至xshell快速命令效果更佳哦!!!

kill -9 `ps aux|grep jmeter-server|grep -v "grep"|awk '{print $2}'`

三、环境部署

上传文件也是有很多种方法的呢 (`・ω・´)

将修改后的jmeter包压缩上传至服务器,能直接传输可以运用xftp等工具进行。

scp 服务器间的传输方式:

scp root@172.17.58.4:/root/test/api2.0.jmx /home/Androidmov/test/apache-jmeter-4.0
# scp master用户名 @master内网地址:压缩包根目录 slaves保存跟路径

将文件传输至服务器中,在现网环境下会有4A权限限制,可以在ssh登陆服务器中后再运行命令

rz -e   #上传文件,回车后会出现上传窗口
sz      #下载文件,后面需要跟下载文件名,然后回车,选择下载目标目录

上传完包之后,那么接下来就是对jmeter运行环境的准备了哦

解压包,jmeter

上传了当然就需要将jmeter解压出来

unzip apache-jmeter-4.0.zip

解压会在同目录下自动创建一个 apache-jmeter-4.0 文件夹

这样前置的准备工作就完成了,下面进入到环境的调试阶段。

1. 检验java环境安装

> java

> javac

> java -version

jmeter4.0需要java jdk 1.8版本,如下为示例:
[root@otvcloud ~]# java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

非JDK1.8报错

[root@AD-Client-Resource-3 bin]# ./jmeter-server
Unrecognized VM option 'MaxMetaspaceSize=256m'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

java环境未安装

用yum安装JDK(CentOS)
1.首先查看yum库中都有哪些jdk版本
[root@localhost ~]# yum search java|grep jdk

ldapjdk-javadoc.x86_64 : Javadoc for ldapjdk
java-1.6.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.6.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.6.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.6.0-openjdk-javadoc.x86_64 : OpenJDK API Documentation
java-1.6.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.7.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.7.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.7.0-openjdk-javadoc.noarch : OpenJDK API Documentation
java-1.7.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.8.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.8.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.8.0-openjdk-headless.x86_64 : OpenJDK Runtime Environment
java-1.8.0-openjdk-javadoc.noarch : OpenJDK API Documentation
java-1.8.0-openjdk-src.x86_64 : OpenJDK Source Bundle
ldapjdk.x86_64 : The Mozilla LDAP Java SDK
2.选择版本,进行安装

我们这里安装1.8版本,安装完之后,默认的安装目录是在: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64

[root@localhost ~]# yum install java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64
3.设置java环境变量
[root@localhost ~]# vi /etc/profile

添加如下内容:[此处java版本需要根据实际版本进行控制,后缀jre需要注意,如果你下载的java目录下没有,不用添加]

#set java environment
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

让修改生效:

[root@localhost java]# source /etc/profile
4.验证
注:因为采用yum安装jdk,系统考虑到多版本的问题,会用alternatives进行版本控制。开始,相应版本的jdk安装在/usr/lib/jvm/之后,会在alternatives中注册,在/etc/alternatives目录下会产生一些链接到/usr/lib/jvm/中刚安装好的jdk版本。
在/usr/bin下面会有链接到/etc/alternatives的相应的文件。比如,/usr/bin下面会有一个链接文件java的映射关系如下:

/usr/bin/java->/etc/alternatives/java
/etc/alternatives/java-> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64/jre/bin/java

这样,java命令不用设置环境变量,就可以正常运行了。但如果对于tomcat或其他软件来说还是要设置环境变量。
同样,如果安装新的版本jdk,就会重新链接到最新安装的jdk版本。当然,也可以使用alternatives修改所要使用的版本。
具体方法可参照:《使用Linux的alternatives管理多版本的软件》
java环境安装之后检验jmeter能否在linux环境下运行,执行以下语句:
[root@localhost bin]##jmeter -v               # 执行成功会出现jmeter标志

如果报错:
bash: /home/Androidmov/apache-jmeter-4.0/bin/jmeter: 权限不够
应当修改jmeter权限:
[root@localhost bin]# chmod 777 jmeter
# 同样适用于jmeter-server

2.jmeter环境变量添加

在linux中添加环境变量有两种,一种是全局变量[/etc/profile],另一种是当前用户环境变量[ /.bashrc],对于测试环境当然是放在全局变量中最好不过了,但是对于现网而言,最好是放在临时用户的环境变量中。【权限越大风险越大】

[root@localhost bin]# vim  ~/.bashrc
[root@localhost bin]# vim  /etc/profile

粘贴以下内容,注意修改jmeter路径

export JMETER_HOME=/root/apache-jmeter-4.0
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH:$HOME/bin

修改即时生效:

# 指定用户:
[root@localhost bin]# source ~/.bashrc
# 系统变量:
[root@localhost bin]# source /etc/profile

3.防火墙

1) 重启后生效 
开启: chkconfig iptables on 
关闭: chkconfig iptables off 

2) 即时生效,重启后失效 
开启: service iptables start 
关闭: service iptables stop

4.内核参数修改

【以下方法同样适用于对服务器进行性能优化,详细可参考:http://blog.51cto.com/zhangziqiang/500204】

在施加压力的过程中jmeter启动的java进程会消耗大量的端口资源,如果不能即时的释放,就会使jmeter无法发出新的请求,这时jmeter就会报错。这个时候我们可以考虑优化TCP/IP 的内核参数,来及时将TIME_WAIT状态的端口清理掉。

查看当前TCP/IP连接的状态和对应的个数:

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

这个命令会显示出类似下面的结果:

TIME_WAIT 63648
FIN_WAIT1 3
FIN_WAIT2 4
ESTABLISHED 184
LISTEN 17

这个命令同样可以在压测过程中去实时查看应用服务器与数据库服务器的连接状态,更有利于我们分析和判断系统当前的运行情况。

查看当前内存参数:
[root@localhost bin]# sysctl -p

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.tcp_fin_timeout = 5
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

上面最后这三条以及 net.ipv4.tcp_syncookies 就是压力机需要调整的参数。

简单说明一下:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_fin_timeout 修改系统默认的 TIMEOUT 时间。
修改参数:
[root@localhost bin]# vim /etc/sysctl.conf
输入命令,参数生效:
[root@localhost bin]# /sbin/sysctl -p

四、调试jmeter、jmeter-server

试着运行jmeter,以及jmeter-server,进行正式压测前的调试工作;

  1. jmeter无头模式正常运行;
  2. jmeter并发量大情况下压力机能保证端口的供应;
  3. master正常调用slaves对目标服务器施加压力;
  4. 报告仪表盘数据正常

1.jmeter no data to display

这个报错在报告仪表盘文件夹中,导出后,打开网页出现 jmeter no data to display
就可以使用以下方法解决。

在服务器上的 /bin/user.properties 加入如下参数:

jmeter.save.saveservice.output_format=xml

jmeter.save.saveservice.response_data=true

jmeter.save.saveservice.samplerData=true

jmeter.save.saveservice.requestHeaders=true

jmeter.save.saveservice.url=true

jmeter.save.saveservice.responseHeaders=true

2.未禁用ssl报错

[root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server
Server failed to start: java.rmi.server.ExportException: Listen failed on port: 0; nested exception is:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
An error occurred: Listen failed on port: 0; nested exception is:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
试运行报错:
[root@AD-Manage-Log-SP bin]# jmeter -n -t test/search.jmx -r
Creating summariser <summary>
Created the tree successfully using test/search.jmx
Configuring remote engine: 10.255.50.12
Exception creating connection to: 10.255.50.12; nested exception is:
    java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
Failed to configure 10.255.50.12
Configuring remote engine: 10.255.50.62
Exception creating connection to: 10.255.50.62; nested exception is:
    java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
Failed to configure 10.255.50.62
Stopping remote engines
Remote engines have been stopped
Error in NonGUIDriver java.lang.RuntimeException: Following remote engines could not be configured:[10.255.50.12, 10.255.50.62]

3.jvm堆过小

[root@iZ949uw2xehZ bin]# ./jmeter
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/jmeter/apache-jmeter-4.0/bin/hs_err_pid5855.log
java.lang.OutOfMemoryError:gc overhead limit exceeded。

jmeter使用注意事项

1、单击压测过程中使用过多的线程,官网建议1000-2000。具体看机器的配置和启动应用的情况。(A single JMeter client running on a 2-3 GHz CPU (recent CPU) can handle 1000-2000 threads depending on the type of test.)

(官网:http://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.html)

2、监听器里面配置写入到文件,不写入到文件的话所用监听结果存放在内存。还要注意不要使用“察看结果树”监听器。

3、运行压测过程中使用no-gui模式,不要使用界面压测,使用jmeter -n -t这样的命令去运行。

解决办法:

编辑jmeter   # linux环境下非jmeter.sh !!!
搜索 : "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"
改变初始堆内存和最大堆内存

1. 修改默认堆内存大小    
#默认的  
HEAP="-Xms512m -Xmx512m" ,
#修改后
HEAP="-Xms1024m -Xmx1024m"

2. 增加jmx端口,用于监控jvm 堆内存
# 可以不做修改
在尾部加入:   

 JMX="-Dcom.sun.management.jmxremote -Djava.awt.headless=true -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote
.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.172.47"

修改ARGS变量,加入$JMX,注意空格 
ARGS=" $SERVER $DUMP $HEAP $NEW $SURVIVOR $TENURING $EVACUATION $PERM $JMX"
 

4.非java-1.8 报错

[root@AD-Client-Resource-3 bin]# ./jmeter-server
Unrecognized VM option 'MaxMetaspaceSize=256m'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
解决:先查看java版本如果是1.7请先升级至1.8,
原因:jmeter4.0需要在8以上才能运行。

5. jmeter-server运行报错

[root@EPG-Test bin]# ./jmeter-server
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[222.221.5.252:41914](local),objID:[34f0793b:1671bcd6f7b:-7fff, 1060029434609099351]]]
Problem creating registry: java.rmi.server.ExportException: Port already in use: 1099; nested exception is:
	java.net.BindException: Address already in use (Bind failed)
Continuing...

原因:
在运行slaves上运行jmeter-server时会存在端口问题,第一次运行报错后需要检查端口1099是否被占用。

五、检验jmeter能否运行

检查是否可以正常运行

[hnpt@Wechat-MongDB-Slave bin]$ ./bin/jmeter -v
    _    ____   _    ____ _   _ _____       _ __  __ _____ _____ _____ ____
   / \  |  _ \ / \  / ___| | | | ____|     | |  \/  | ____|_   _| ____|  _ \
  / _ \ | |_) / _ \| |   | |_| |  _|    _  | | |\/| |  _|   | | |  _| | |_) |
 / ___ \|  __/ ___ \ |___|  _  | |___  | |_| | |  | | |___  | | | |___|  _ <
/_/   \_\_| /_/   \_\____|_| |_|_____|  \___/|_|  |_|_____| |_| |_____|_| \_\ 4.0 r1823414

Copyright (c) 1999-2018 The Apache Software Foundation

1、如果运维创建了临时账号给你使用,在临时账户中需要给权限给jmeter,否则会抛错。

chown -R  hnpt:hnpt test/
test文件夹下所有文件一次性赋权命令

执行前:
-rwxrwxrwx 1 root root  8162 Feb  7  2018 jmeter

执行后:
-rwxrwxrwx 1 hnpt hnpt  8162 Feb  7  2018 jmeter

六、运行jmeter压测

我们准备工作做好了之后就进入到我们正式压测的过程中了,在linux环境下运行jmeter脚本。

1、无头模式下运行脚本

无头模式,又称非界面模式,因为jmeter在界面模式下运行会占用很大一部分资源,同时如果开启了查看结果的话,更会使得这一现象变得严重,所有我们的正式压测会采用无头模式进行。

第一种执行方式一般用于验证脚本,不需要任何输出,测试ip,port是否正确,也用于验证测试。

jmeter -n -t [jmx脚本位置]

-n  即为无头模式命令
-t  为执行压测脚本

命令模式下运行jmeter脚本,会在屏幕上显示当前的运行情况,每30秒打印一次数据,但是会默认存为result.jtl在bin目录下,所有需要对其进行指导目录和名称。

jmeter -n -t [.jmx脚本位置] -l [.jtl文件目录]

-l 为输出测试结果

jtl文件格式可以直接导出值Windows系统,然后在jmeter界面中新建一个监听器就可以打开查看。当然也可以保存为csv格式,导出进行查阅。

在压测时间长,并发量大的情况下不建议这样做,因为jtl会有几百兆甚至于几个G的内容。同时jtl格式文件也是后面转换仪表盘的重要前提。

建议: 可以在bin目录下新建一个test文件,将输出放在该文件夹中,包括后面的仪表盘空白文件夹,创建jtl文件和空白文件夹可以以中间带下划线的方式,这样可以有效避免误操作,在运行一次脚本后可以通过执行删除命令清理环境,方便继续执行压测。

rm -rf test/*_*

2、带输出结果的测试

jmeter -n -t 【Jmx脚本位置】-r -l 【中间文件result.jtl位置】-e -o 【报告指定文件夹】

# -r    为执行全部slaves,如果换成-R 后面需要跟ip地址用逗号隔开 

注意: 不写位置的化中间文件默认生成在bin下,下次执行不能覆盖,需要先删除result.jtl;报告指定文件夹同理,需要保证文件夹为空

以上就为本次对于jmeter的简单总结,谢谢!!!

发布了4 篇原创文章 · 获赞 1 · 访问量 1万+
展开阅读全文
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览