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

    Jmeter的集群模式可以让我们将多台机器联合起来一起产生负载,从而弥补单台机器负载生成能力不足的问题。

    假设我们的测试计划会产生100个threads,我们使用6台机器进行分布式测试的时候,一共会产生100 * 6 = 600的负载。

    日常情况,大部分的性能需求,单台压测机就可以抗住的。4C8G的window server机器,使用UI方式,最高压测过2000并发(RT 20ms以内),单机没什么问题(当然如果IO很高的话,注意压测机网卡可能会先出现瓶颈。)

     超过2000并发,可使用分布式。

    一、注意事项

    1、关闭防火墙,开放端口

    2、所有机器最好都在同一个子网上。

    选择和被测目标服务同网段的机器作为压测机,很多人都是直接在办公环境的自己机器上压测,这种压测很不稳定,时好时坏,如果你们没有做流量隔离,说不定你会把你们的办公环境压垮!

    3、一定要用内网IP,不要用公网IP,用ping去检查。

    4、确保所有系统上使用相同版本的jdk和jmeter,包括大版本和小版本。

    可使用下面的命令,远程拷贝,确保所有机器的软件包相同

      远程拷贝命令(内网地址):
      scp -r /usr/local/software/jdk-8u141-linux-x64.tar.gz root@172.18.230.233:/usr/local/software
      scp -r /usr/local/software/jmeter/apache-jmeter-4.0.tgz root@172.18.230.233:/usr/local/software/jmeter

    5、禁用SSL

    vim jmeter.properties

    server.rmi.ssl.disable=true

    二、专业名称

    master:司令

    slave:奴隶

    target:目标

    Jmeter分布式压测原理
    1、总控机器的节点master,其他产生压力的机器叫“肉鸡” server
    2、master会把压测脚本发送到 server上面

    3、执行的时候,server上只需要把jmeter-server打开就可以了,不用启动jmeter
    4、结束后,server会把压测数据回传给master,然后master汇总输出报告

    三、压测步骤

    1、在master和slaves机器上分别按照相同版本的jdk和jmeter

    2、在master机器上

    1)修改配置文件,进入jmeter/bin目录下

    vim jmeter.properties

    remote_hosts=192.168.0.102:8899,192.168.0.101:8899(slaves机器的ip和端口)
    server.rmi.ssl.disable=true(禁用ssl)

    如果master即作为master也作为slaves

    remote_hosts=192.168.0.102:8899,192.168.0.101:8899,master的ip:8899
    
    server_port=8899
    
    server.rmi.ssl.disable=true(禁用ssl)

    2)启动jmeter服务

    ./jmeter-server(linux)

    jmeter-server.bat(windows)

    3)检查是否启动成功

    ps -ef|grep jmeter-server

    3、在slaves机器上

    1)修改配置文件,进入jmeter/bin目录下

    vim jmeter.properties

    remote_hosts=127.0.0.1
    
    server_port=8899
    
    server.rmi.ssl.disable=true(禁用ssl)

    2)启动jmeter服务

    ./jmeter-server(linux)

    jmeter-server.bat(windows)

    3)检查是否启动成功

    ps -ef|grep jmeter-server

    4、分布式执行

    GUI模式 :运行——》远程启动、远程启动全部

    non-GUO模式:命令行增加-r参数

    jmeter -n -t /Users/jack/Desktop/remote.jmx -r -l /Users/jack/Desktop/jtl/result.jtl -e -o /Users/jack/Desktop/result

    四、常见问题

    安装常见问题
    1、问题
    [root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server
    Created remote object: UnicastServerRef2 [liveRef: [endpoint:[:39308](local),objID:[24e78a63:16243c70661:-7fff, 7492480871343944173]]]
    Server failed to start: java.rmi.RemoteException: Cannot start. Unable to get local host IP address.; nested exception is:
    java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known
    An error occurred: Cannot start. Unable to get local host IP address.; nested exception is:
    java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known

    解决:
    hostname 命令获取机器名称,追加一个映射 iZwz95j86y235aroi85ht0Z
    vim /etc/hosts
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    120.79.160.143 iZwz95j86y235aroi85ht0Z

    windows用户 修改c:windowssystem32driversetchosts文件,增加一条域名 与IP的映射

    2、问题
    [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)
    解决:
    拥有RMI over SSL的有效密钥库,或者禁用了SSL。
    1、禁用SSL
    jmeter.property里面 server.rmi.ssl.disable 改为 true,表示禁用


    3、问题:
    [root@userCenter bin]# ./jmeter-server
    Created remote object: UnicastServerRef2 [liveRef: [endpoint:[127.0.0.1:39687](local),objID:[-18db419a:167773db861:-7fff, -176377700206527642]]]
    Server failed to start: java.rmi.RemoteException: Cannot start. userCenter is a loopback address.
    An error occurred: Cannot start. userCenter is a loopback address.
    解决:
    执行时加上参数./jmeter-server -Djava.rmi.server.hostname=10.1.1.222

    4、问题:
    [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

    解决:
    编辑jmeter
    搜索 : "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"
    改变初始堆内存和最大堆内存


    5、仅修改 server_port 即可,下面两者一样
    server.rmi.localport=8899 表示slave server启动显示的端口
    server_port=8899 表示master机器要远程连接的端口 即 remote_hosts=xxxx:8899

    6、<!-- jmeter 分布式性能测试(多网卡配置) -->
    我们要在多网卡的服务器上开启RMI服务的话必须指定IP,使他们能够在同一个网段内。

    需要以下几步(假定所有机器都在10.120.11.*网段,agent服务器为linux,controller服务器为windows):

    1) 修改agent服务器,指定agent机器的IP
    修改jmeter-server文件
    # vi jmeter-server
    修改RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx(需要连接的IP)

    2)修改server服务器,指定server机器的IP

    修改jmeter.bat文件

    新增set rmi_host=-Djava.rmi.server.hostname=10.120.11.214

    修改set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %DDRAW% %rmi_host%


    7、确定在controller机器上安装jdk,版本和jmeter一致,配置环境变量:Java_home等
    在Agent机器上安装jdk,配置环境变量:Java_home和JMeter_home
    安装目录不要带空格,最好都是简短的英文路径


    8、master机器启动后会拷贝jmx文件到slave机器,所以不需要在每台slave机器上也上传一份jmx,只需要在master机器上上传一份jmx脚本即可。

    如果使用csv进行参数化,则需要把参数文件在每台slave上拷一份且路径需要设置成一样的。

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


    9、连接失败原因排查
    以下步骤进行排查:
    1. jmeter-server是否启动;
    2. 是否联网
    3. ping 服务器IP是否畅通.
    4. telnet 端口 192.168.3.10 1099
    5. 检查服务器的防火墙是否关闭。
    6. 阿里云安全策略是否正常

    10、"could not find ApacheJmeter_core.jar"
    解决:在Agent机器安装jdk,并设置环境变量


    11、”Bad call to remote host"
    解决:检查被控制机器上的jmeter-server有没有启动,或者remote_hosts的配置是否正确。

  • 相关阅读:
    匹配下拉控件
    验证视图状态 MAC 失败
    打开网页要输入用户名和密码的解决方案!
    ASP.NET网站安装部署参考总结!
    IOS开发中常量的处理
    typedef与define的区别
    OC的单例模式
    js for循环中传入动态参数
    javascript array map方法
    javascript 得到兄弟节点的方法,jquery妙用
  • 原文地址:https://www.cnblogs.com/loveapple/p/10064134.html
Copyright © 2011-2022 走看看