你们在使用jmeter压测过程当中,可能会度遇到内存溢出的错误,这是为何呢?html
由于jmeter是java写的应用,java应用jvm堆内存heap受负载机硬件限制,虽然咱们能够调整堆内存大小,java
可是单机没法支撑数以万计大并发,此时,须要多个负载机进行分压测试,这样性能瓶颈就不会是咱们的负载机了。linux
jmeter分布式压测时,选择其中一台做为控制机,其他的机器作为负载机,apache
执行时,控制机会把脚本发送到每一个负载机上,负载机获取到脚本就执行脚本(负载机只须要启动jmeter-server.bat或者jmeter-server),windows
执行后,负载机回传执行结果给控制机,控制机会进行汇总。值得注意的是:若是请求执行成功,不会回传请求的响应信息,因此在查看结果树中, 响应结果看到是空的。安全
http://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.html服务器
原理图(截图自官网)并发
http://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.htmljvm
看不懂英文的本身翻译哦,看懂了,少踩坑。分布式
保证控制机和负载机上jdk、jmeter版本同样,不然会出一些意外的问题,
关闭防火墙:service iptables stop
能够先看防火墙状态,若是是关闭的,就不用管了。
因为机器数量的缘由,我这里演示windows既做为控制机,又做为负载机,另一台负载机是个人linux虚拟机。可是控制机会接收负载机回传的结果数据,因此自身有性能消耗,最好是负载机单独一台机器。
另外,这样有个问题,若是有参数化文件,须要拷贝到每台负载机上,路径要同样,而windows和linux上路径确定是不同的,因此,负载机要么都是windows,要么都是linux,
为了演示方便,个人脚本就不用参数化文件了,且这里演示rmi传输机制使用ssl方式
bin目录下执行./jmeter-server
解决办法:./jmeter-server -Djava.rmi.server.hostname=192.168.116.128
下面提示缺乏jsk文件
不论是负载机仍是控制机(若是控制机也做为负载机),执行jmeter-server.bat(linux下执行jmeter-server,另外:linux下检查是否启动成功:ps -ef | grep jmeter-server),报以下错,
是由于从JMeter 4.0开始,RMI的默认传输机制将使用ssl。SSL须要密钥和证书才能工做,不使用ssl将存在安全漏洞
在控制机bin目录下,点击:create-rmi-keystore.bat
根据提示一直填下去,遇到Yes与No就直接填y,而后回车就ok了
回车后生成文件:rmi_keystore.jks
复制控制机生成的rmi_keystore.jks到每一台负载机jmeter的bin目录下
负载机配置文件中,修改端口号
搜索jmeter-server
默认端口1099
端口号修改成2099
执行jmeter-server
控制机telnet负载机,看端口通不通
telnet通了,
控制机配置文件
配置负载机
测试脚本
关于下面的监听器:查看结果树,主要是用于调试脚本的时候用,调试好后,把这个监听器禁用掉
压测过程当中,能够看聚合报告,若是有失败的请求,能够立刻远程链接服务器查看错误日志
可是,若是没有远程服务器的权限,就能够不由用这个监听器,可是要勾选“仅错误日志”
3个线程,运行5次,总共15次
远程启动linux负载机
取样器结果
请求
响应数据为空
并且,哪怕勾选保存结果,查看结果树中依旧没有结果,这多是jmeter自己的设置,由于若是回传大量数据,会影响性能结果
聚合报告,3个线程,运行5次,总共15次
负载机控制台输出的信息
以前有群友问:响应为空,加了断言,那是如何断言的呢?
虽然咱们在查看结果树中看不到响应,生成的jtl文件,打开也没有结果,可是,jmeter发了请求后,服务器会把响应结果返给jmeter,jmeter会根据返回自动化进行断言,和咱们可否看到响应没有关系。
能够远程运行脚本:运行--远程启动--压力机
响应结果为空
响应头
改一个不会返回的断言
远程运行
查看结果
虽然上面没有返回结果,可是下图表示依然作了正确的断言
控制机ip
修改配置文件,远程主机加入本机,默认端口1099
执行jmeter-server.bat
telnet本机1099端口
端口不通
上面执行jmeter-server.bat,显示的是下面192.168.56.1这个地址(由于我本机只连了无线,没有本地链接)
telnet1099端口
能够通
修改配置文件
保存后重启jmeter-server.bat、jmeter.bat
只远程启动windows负载机
聚合报告
控制台信息
远程启动全部
聚合报告,总样本数 = 线程数 * 循环次数 * 执行机总数
30 = 3 * 5 * 2
至此,jmeter5.1分布式压测环境搭建完成。
而后就能够设置线程,跑并发了,好比并发200线程,每秒启动20个线程,并发运行15分钟
jmeter -n -t 脚本绝对路径名.jmx -l 要保存的结果绝对路径名.jtl -H 192.168.116.128 -P 2099
生成jtl结果文件
查看结果树
聚合报告
jmeter -n -t 脚本绝对路径名.jmx -l 要保存的结果绝对路径名.jtl -R 192.168.116.128:2099,192.168.56.1
其实,在实际压测的时候是有时仍是不使用命令行方式的,由于看不到tps波动状况(固然,能够用其它的监控,好比:JMeter+Grafana搭建可视化实时性能测试数据监控)
通常来讲,若是有大的波动,是须要当即链接服务器查看各个资源的状况的,好比线程池、链接池,
虽然命令行执行完后会生成jtl结果文件,可是压测完,压测过程当中建立的各类链接都释放了,也就没法定位到问题了,
若是有失败的请求还好点,这样能够根据错误日志来分析定位问题
总之,性能测试的重点及难点是:监控、分析、定位、调优。