zoukankan      html  css  js  c++  java
  • Jmeter之分布式测试

    1)Jmeter 是纯java 应用,对于CPU和内存的消耗比较大,并且受到JVM的一些限制; 

      一般情况下,依据机器配置,单机的发压量为300~600,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就容易卡死,引起JAVA内存溢出错误;(在1.4GHz~3GHz的CPU、1GB内存的JMeter客户端上,可以处理线程100~300。但是WebService例外。XML处理是CPU运算密集的,会迅速消耗掉所有的CPU。一般来说,以XML技术为核心的应用系统,其性能将是普通Web应用的10%~25%。)

    (2)单台机器模拟的时候,如果并发数量较多且发送的网络包较大时,单机的网络带宽就会成为测试瓶颈,无法真正模拟高并发,导致测试结果失真(例如在要一秒内发送3000个请求,合计512kb,但是测试电脑只有256的上传带宽,那么实际测试的时候只是模拟了在一秒内发送1500个请求(256kb)的场景,导致测试结果失真。下载带宽的影响也是类似的);即:如果所有负载由一台机器产生,网卡和交换机端口都可能产生瓶颈,所以一个JMeter客户端线程数不应超过100。

    (以上是测试机器的分析;应该还有别的,如硬盘等)

    (3)真正的业务场景并发,我觉得应该是用户数大,每个用户的请求数小。如:更可能是1000个用户在2秒内各发起2个请求,而不是200个用户在2秒内各发起10个请求,虽然总的请求数都是2000个。

      为避免以上问题,更合理地进行性能测试,我们可以使用Jmeter提供的分布式测试功能。

    Jmeter分布式执行原理:

      1、Jmeter分布式测试时,选择其中一台作为调度机(master/Controller),其它机器做为执行机(slave/Agent)。

      2、执行时,master会把脚本发送到每台slave上,slave 拿到脚本后就开始执行,slave执行时不需要启动GUI,应该是通过命令行模式执行的。

      3、执行完成后,slave会把结果回传给master,master会收集所有slave的信息并汇总。

    如下图所示:

    wKioL1gFzy7BQLKVAAB_A3-0kLE290.png

                   此图取自http://www.cnblogs.com/fengpingfan/p/5583954.html

    注意:

    (1)每一台jmeter远程服务器(slave机器)都执行相同的测试计划,jmeter不会在执行期间做负载均衡,每一台服务器都会完整地运行测试计划;

    (2)采用JMeter远程模式并不会比独立运行相同数目的非GUI 测试更耗费资源。但是,如果使用大量的JMeter 远程服务器,可能会导致客户端过载,或者网络连接发生拥塞;

    (3)默认情况下,master机器是不执行参与生成并发数据的;

    (4)调度机(master)和执行机(slave)最好分开,由于master需要发送信息给slave并且会接收slave回传回来的测试数据,所以mater自身会有消耗,所以建议单独用一台机器作为mater。

    分布式测试操作步骤:

    1、准备多个测试电脑(m1、s1、s2、s3, master、slave),并都安装1.7以上版本jdk,配置环境变量;

    2、将m1使用的Jmeter打包发到c1、c2、c3电脑,并于在相同路径下安装。这样就保证了Jmeter版本一致,额外下载安装的插件一致。如果要用到csv作为数据源,那么强烈建议将csv文件放到binexamples等文件夹下,这样在slave机上才能正确读取-因为安装路径一致所以csv路径也就一致了;

    3、设置并启动slave机器

    (1)分别在s1、s2、s3(slave机器)上,进入%JMETER HOME%/bin/目录,

    打开“jmeter.properties”,配置执行机远程启动端口(默认为 1099),

    如改为:

    server_port=1029

    server.rmi.localport=1029

    (2)运行JMeter-server.bat(windows系统)/jmeter-server.sh (linux)来启动slave机器的Jmeter,正常启动后会弹出命令行窗口,提示"created remote object";

    wKiom1gF0LCBBCuBAABuubkxT9g472.png

    注:我这被坑了,如上截图(我没有改端口,使用默认的),ip后面有一个冒号,跟着一串数字61470,我开始以为有这么奇怪的端口号,把这个配到master机中,发现启动不了,所以slave机器的端口号要在“jmeter.properties”中查看、配置;

    4、配置、启动master机器

    (1)在m1(master机器)的%JMETER HOME%/bin/目录,找到 JMeter.properties 这个文件,使用notepad++或记事本等工具打开。

    (2)在打开的文件中查找“remote_hosts”,你会找到“remote_hosts=127.0.0.1”。

    127.0.0.1指本机,表示本机也可作为JMeter Agent运行的机器。

      这里需要将slave机器的IP及端口号以追加的形式填入,使用逗号分隔,末尾不用加标点符号,如“remote_hosts=192.168.88.180:1099,192.168.88.218:1099”;

    其中的 1099 为 JMeter 的 Controller 和 Agent 之间进行通讯的默认 RMI 端口号;

    wKioL1gF1x2QyF2LAABYMAzgAnM705.png

       (引申阅读:从JMeter 2.3.1开始,JMeter远程服务器会自己启动RMI注册;用户没有必要单独启动RMI注册。假设测试人员一定要单独启动RMI注册,可以在远程节点上定义JMeter属性server.rmi.create=false。

       默认情况下,JMeter远程服务器的RMI使用动态端口号。这样就会为防火墙配置带来麻烦,因此JMeter 2.3.2及其以后的版本,会检查JMeter属性server.rmi.localport。如果该值非零,JMeter远程服务器就会用它来作为本地端口号。)

    (3)保存文件,然后运行m1上Jmeter.bat,启动gui界面,并进入 Run -> Remote Start 菜单项,在这里可以看到远程启动菜单下面有刚刚添加的两个slave机器的ip地址

    wKiom1gF2C7STdzqAAB-vVuZerg567.png

    在这里,我们可分别启动点击ip地址启动对应的slave机器,也可以直接选择“远程全部启动”来将所有的slave启动。

    (4)有时候用作slave的机器太少,仍不能满足需要,则需要将作为master的电脑也当作slave,则同样需要修改 JMeter.properties文件,将master的IP、端口写入。

    类似其他slave机器,需要先启动机器的jmeter-server.bat,然后再打开JMeter.bat,进入Run -> Remote Start菜单,可以看到master机器也作为远程机器了。

    5、验证分布式测试是否成功

    为了便于验证,我先设置一个线程,发送一个请求;

    wKioL1gF3R2wm59pAABvG90iNCo402.png

    (1)我只启动一台192.168.88.180这台slave机,

    察看结果树,可知,只发送了一次请求,且master机器没有收集通过了断言的请求;

    wKiom1gF3x_xPKx8AACPqPF0Smw763.png

    在slave机器的控制台也输出了被调用命令

    wKiom1gF352yiUogAACPTswvPqY847.png

    (2)我启动所有slave机器(我这里设置了两台),

    察看结果树可知,两台slave机器都各发送了一次请求,并且master机器收集没有通过了断言的请求响应信息;

    wKioL1gF4PPzTXVHAACrBTtpwA8314.png

    请求数计算

    总样本数 = 线程数 * 循环次数 * 执行机总数

    样本计数逻辑:由 JMeter分布式执行原理可知,执行机(Slave)执行的测试脚本是由调度机(master)分发的,故每台执行机执行的测试脚本都是相同的,故而性能测试总样本数 = 测试脚本样本数 * 执行机总数。

    为更好的模拟性能并发场景,还需要设置集合点。后面再写对应的blog。

    常见问题及解决

    1、在连接时报:connection refused to host:10.10.90.69 nested exception is...错误,

    可能原因:jmeter安装文件放到有中文字符的目录路径下,导致启动JMeter-server.bat时报错;

    解决办法:把jmeter安装文件放到其他没有中文字符的路径下。

    2、agent机器在发送请求时拿不到CSV文件中的值。

    答:Jmeter主机能够传递测试脚本给Agent机器,但是不能够传递CSV文件的内容,也就是说CSV文件需要在每台agent机器上对应目录拷贝一份。可参考我前面提到的做法;

    3、例如我们要求性能是并发数1200,然后我们有两台slave,那我们写性能测试脚本的时候,是把并发数写成600,然后把脚本复制到每一台Agent设备?还是写一个并发数1200的脚本,在Controller上运行即可,Controller会自动分配性能压力?抑或者写一个并发数为600在Controller端运行,同样配置下发到每个Agent上呢?

    答:master会给每个slave发送同一份jmx,所以每一个slave都运行相同并发数,只要保证总和是我们的性能需求即可。

    4、怎么查看端口是否被占用?被占用怎么处理?

    答:

    (1)查看1099端口:

    netstat -ano | findstr "1099"

    tasklist | findstr "1099"

    (2)打开“jmeter.properties”,配置执行机远程启动端口(默认为 1099),

    如改为:

    server_port=1029

    server.rmi.localport=1029

    5、在Controller端上控制某台机器Run,提示"Bad call to remote host"。

    解决方法:检查slave机器上的jmeter-server有没有启动,

    检查master机器上的JMeter.properties中remote_hosts的配置是否有错误。

    6、Agent机器启动Jmeter_server.bat时,后台提示:"could not find ApacheJmeter_core.jar"

    解决方法:确定在Agent机器安装jdk,并设置环境变量

    7、无法连接slave机器,

    可能原因:slave机器开启了防火墙,网络不通等;

    解决办法:关掉防火墙;

    检查slave服务器和被测试服务器之间是否可以ping通;

    8、slave机器执行脚本的时候,若断言执行成功则不返回请求响应数据及详细断言信息。

    9、master机器上收不到slave机器连接过来的信息。

    方案:检查slave服务器的hostname和/etc/hosts中服务器对应的名字是否相同,就是ip、端口配对了没

    10、csv文件最好设置相对路径,不要设置绝对路径以免出现问题。

  • 相关阅读:
    【算法学习笔记】76.DFS 回溯检测 SJTU OJ 1229 mine
    【算法学习笔记】75. 动态规划 棋盘型 期望计算 1390 畅畅的牙签盒(改)
    【算法学习笔记】74. 枚举 状态压缩 填充方案 SJTU OJ 1391 畅畅的牙签袋(改)
    【算法学习笔记】73.数学规律题 SJTU OJ 1058 小M的机器人
    【算法学习笔记】72.LCS 最大公公子序列 动态规划 SJTU OJ 1065 小M的生物实验1
    【算法学习笔记】71.动态规划 双重条件 SJTU OJ 1124 我把助教团的平均智商拉低了
    【算法学习笔记】70.回文序列 动态规划 SJTU OJ 1066 小M家的牛们
    【算法学习笔记】69. 枚举法 字典序处理 SJTU OJ 1047 The Clocks
    【算法学习笔记】68.枚举 SJTU OJ 1272 写数游戏
    【算法学习笔记】67.状态压缩 DP SJTU OJ 1383 畅畅的牙签袋
  • 原文地址:https://www.cnblogs.com/huxinping8800/p/7083750.html
Copyright © 2011-2022 走看看