zoukankan      html  css  js  c++  java
  • jmeter5.1分布式压测

    为什么要用分布式

    大家在使用jmeter压测过程中,可能会度遇到内存溢出的错误,这是为什么呢?

    因为jmeter是java写的应用,java应用jvm堆内存heap受负载机硬件限制,虽然我们可以调整堆内存大小,

    但是单机无法支撑数以万计大并发,此时,需要多个负载机进行分压测试,这样性能瓶颈就不会是我们的负载机了。

    分布式的原理

    jmeter分布式压测时,选择其中一台作为控制机,其余的机器做为负载机,

    执行时,控制机会把脚本发送到每个负载机上,负载机获取到脚本就执行脚本(负载机只需要启动jmeter-server.bat或者jmeter-server),

    执行后,负载机回传执行结果给控制机,控制机会进行汇总。值得注意的是:如果请求执行成功,不会回传请求的响应信息,所以在查看结果树中, 响应结果看到是空的。

    http://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.html

    原理图(截图自官网)

    分布式压测注意事项

    http://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.html

    看不懂英文的自己翻译哦,看懂了,少踩坑。

    保证控制机和负载机上jdk、jmeter版本一样,否则会出一些意外的问题,

    关闭防火墙:service iptables stop

    可以先看防火墙状态,如果是关闭的,就不用管了。

    分布式环境搭建说明

    由于机器数量的原因,我这里演示windows既作为控制机,又作为负载机,另外一台负载机是我的linux虚拟机。但是控制机会接收负载机回传的结果数据,所以自身有性能消耗,最好是负载机单独一台机器。

    另外,这样有个问题,如果有参数化文件,需要拷贝到每台负载机上,路径要一样,而windows和linux上路径肯定是不一样的,所以,负载机要么都是windows,要么都是linux,

    为了演示方便,我的脚本就不用参数化文件了,且这里演示rmi传输机制使用ssl方式

    仅linux服务器作为负载机

    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会根据返回自动化进行断言,和我们能否看到响应没有关系。

    可以远程运行脚本:运行--远程启动--压力机

    响应结果为空

    响应头

    改一个不会返回的断言

    远程运行

    查看结果

    虽然上面没有返回结果,但是下图表示依然做了正确的断言

    仅windows控制机作为负载机

    控制机ip

    修改配置文件,远程主机加入本机,默认端口1099

    执行jmeter-server.bat

    telnet本机1099端口

    端口不通

    上面执行jmeter-server.bat,显示的是下面192.168.56.1这个地址(因为我本机只连了无线,没有本地连接)

    telnet1099端口

     

    可以通

    修改配置文件

    保存后重启jmeter-server.bat、jmeter.bat

    只远程启动windows负载机

    聚合报告

    控制台信息

    windows和linux同时作为负载机

    远程启动所有

    聚合报告,总样本数 = 线程数 * 循环次数 * 执行机总数

    30 = 3 * 5 * 2

    至此,jmeter5.1分布式压测环境搭建完成。

    然后就可以设置线程,跑并发了,比如并发200线程,每秒启动20个线程,并发运行15分钟

    通过非GUI命令行方式远程启动

    单负载机

    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+Influxdb+Grafana监控平台搭建

    一般来说,如果有大的波动,是需要立即连接服务器查看各个资源的情况的,比如线程池、连接池,

    虽然命令行执行完后会生成jtl结果文件,但是压测完,压测过程中创建的各种连接都释放了,也就无法定位到问题了,

    如果有失败的请求还好点,这样可以根据错误日志来分析定位问题

    总之,性能测试的重点及难点是:监控、分析、定位、调优。

    性能测试:从0到实战

    https://www.cnblogs.com/uncleyong/p/12311432.html

  • 相关阅读:
    点对点PSCV
    开机启动文件夹
    SpringBoot占用端口
    停止8080端口
    java JDK下载与安装教程
    JRebel热部署
    取消ctrl+alt+箭头 旋转
    空指针调试
    xdebug 断点调试,时间过长会出现超时如何解决
    vue 无法加载文件 CProgram Filesnodejsnpm.ps1,因为在此系统上禁止运行脚本
  • 原文地址:https://www.cnblogs.com/uncleyong/p/10854152.html
Copyright © 2011-2022 走看看