• Jmeter分布式压测及踩坑记录


    Jmeter分布式压测介绍

    在工作中使用jmeter做大并发压力测试的场景下,单机受限内存、CPU、网络IO,会出现服务器压力还没有上去,但是压测服务器已经由于模拟的压力太大死机了。为了让jmeter工具提供更强大的负载能力,jmeter提供了多台机器同时产生负载的机制。

    工作节点(slave)配置

    工作节点(slave)
    负载机(slaves)端口:tcp 1099

    • jmeter.properties:
      • 关闭SSL:server.rmi.ssl.disable=true
    • system.properties
      • 添加java.rmi.server.hostname=192.168.12.106 (IP为slave机器IP)
    • 运行:jmeter-server

    Windows:

    ip地址为负载机的IP


    如果弹出是否允许防火墙,点击允许
    Linux:
    进入到Jmeter bin目录下
    vim jmeter.properties

    vim system.properties

    IP地址为负载机的IP
    ./jmeter-server

    控制节点(master)配置

    控制节点(master):
    端口:udp 4445

    • jmeter.properties
      • 添加负载机ip:remote_hosts=192.168.12.106,192.168.12.107 (IP为所有slave机器IP,以英文,分隔)
      • 关闭SSL:server.rmi.ssl.disable=true

    vim jmeter.properties

    vim jmeter.properties

    ./jmeter.sh

    分布式压测

    如图,可选择相应的远程服务器运行,活动点击远程启动所有,同时在所有远程机器上运行

    注,Jmeter的并发对所有远程机器都是单独进行的,比如设置并发数为2,Jmeter会对所有远程机器的并发都是2,而控制节点实际的并发数是所有远程机器的并发之和
    如下图,设置2个并发

    同时运行2个远程机器,实际并发数为4

    命令行运行:

    $ jmeter -n -t baidu.jmx -l test_baidu.jtl -R 192.168.12.106,192.168.12.107
    Creating summariser <summary>
    Created the tree successfully using baidu.jmx
    Configuring remote engine: 192.168.12.106
    Configuring remote engine: 192.168.12.107
    Starting distributed test with remote engines: [192.168.12.106, 192.168.12.107] @ Sun Feb 21 01:02:32 CST 2021 (1613840552118)
    Remote engines have been started:[192.168.12.106, 192.168.12.107]
    Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
    summary +      1 in 00:00:01 =    1.8/s Avg:   390 Min:   390 Max:   390 Err:     0 (0.00%) Active: 2 Started: 2 Finished: 0
    summary +      3 in 00:00:22 =    0.1/s Avg: 12219 Min:   343 Max: 21252 Err:     0 (0.00%) Active: 0 Started: 4 Finished: 4
    summary =      4 in 00:00:22 =    0.2/s Avg:  9261 Min:   343 Max: 21252 Err:     0 (0.00%)
    Tidying up remote @ Sun Feb 21 01:02:55 CST 2021 (1613840575155)
    ... end of run
    

    注意:如果脚本中有参数化,那么所有salve机器上都必须上传一份参数化文件,且保证路径相同!

    踩坑记录:

    一、jmeter进行分布式测试,远程机器来运行脚本,在察看结果树中的响应数据项为空白
    第一步:打开主控机的jmeter--bin目录下的jmeter.properties文件
    image
    第二步:查找到mode=Standard 项
    image
    第三步:将其前边的注释去掉,然后保存重启jmeter,再次运行远程机器,就可以看到数据了
    image

    二、jmeter压力测试报Address already in use: connect错误
    原因分析:
    这个问题的原因是windows端口被耗尽了(默认1024-5000),而且操作系统要 2~4分钟才会重新释放这些端口,所以可以增加windows的可用端口来解决。windows端口最大数为65535
    解决方法:

    修改操作系统注册表:
    1.cmd中,用regedit命令打开注册表
    2.在 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters下,
      1 .右击parameters,添加一个新的DWORD,名字为MaxUserPort
      2 .然后双击MaxUserPort,输入数值数据为65534,基数选择十进制(如果是分布式运行的话,控制机器和负载机器都需要这样操作哦)
    3.修改配置完毕之后记得重启机器才会生效

    上面这个方法能解决一部分问题。虽然增加了端口数,但压测的时候2分钟内发送超过 70000 个请求,还是报了 Address already in use: connect 的问题。

    解决该问题有两种方法,一种是修改Jmeter配置项,一种是修改操作系统注册表

    解决方法一:.

    修改Jmeter配置项

    不勾选 Use KeepAlive ,该配置默认勾选,去掉勾选后,请求就变为短连接。
    image

    解决方法二:.

    修改操作系统注册表

    1、cmd输入:regedit
    2、找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTCPIPParameters
    3、新建 QWORD值,name:TcpTimedWaitDelay,value:30(十进制)
    4、重启系统
    image
    三、分布式压测时,2台压测机并发不同步
    image
    如上图,2台压测机加压时间相差30s左右

    原因分析:
    由于2台压测机本地时间不一致导致
    解决办法:
    修改2台压测机本地时间相同
    四、分布式压测时,线程异常停止
    image
    如上图,脚本中设置为100并发,但实际压测时,线程加到100时立即停止了一半的线程
    原因分析:
    jmeter运行虚拟内存不足
    解决办法:
    需要调整jmeter运行虚拟内存
    在Jmeter的bin目录下的启动脚本jmeter.bat中,添加或修改jvm配置如下参数

    if not defined HEAP (
        rem See the unix startup file for the rationale of the following parameters,
        rem including some tuning recommendations
        set HEAP=-Xms3g -Xmx3g -XX:MaxMetaspaceSize=1g
    )
    

    image

    可视压测机配置情况加大或减小内存

    重新启动Jmeter,线程启动正常
    image

  • 相关阅读:
    POJ
    POJ
    HDU-3374 String Problem (最小最大表示法)
    HDU-2328 Corporate Identity (暴力)
    HDU-1238 Substrings (kmp)
    kmp处理题型总结
    Numpy用户指南
    Docker 容器连接
    Docker 镜像使用
    docker容器的使用
  • 原文地址:https://www.cnblogs.com/R-bear/p/15036436.html
Copyright © 2020-2023  润新知