Jmeter分布式的坑

转发自: http://www.cnblogs.com/loveapple/p/10064134.html

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,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:\windows\system32\drivers\etc\hosts文件,增加一条域名 与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,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™ 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、
我们要在多网卡的服务器上开启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的配置是否正确。

<think>嗯,用户想知道如何在JMeter中配置CSV数据集用于性能测试。首先,我需要回顾一下JMeter的基本操作和CSV数据集的配置步骤。记得用户提到了几个引用,应该要结合这些内容来回答。 首先,用户需要创建CSV文件,确保格式正确,比如用逗号分隔,没有多余的空格。然后,在JMeter中添加CSV Data Set Config组件,这部分应该在哪个位置呢?对的,是在线程组下的配置元件里。然后需要填写文件名、变量名称这些参数。变量名之间用逗号分隔,对吧?比如username,password。 接下来,配置元件里的其他参数,比如遇到文件结束符时的处理方式,用户可能需要循环使用数据或者停止测试,这里得解释清楚每个选项的作用。比如Recycle on EOF和Stop thread on EOF的区别,还有遇到EOF是否继续循环线程。这些选项会影响测试的行为,用户需要根据实际情况选择。 然后,参数化请求部分,用户需要在HTTP请求中使用变量,比如${username}和${password},这样才能动态替换数据。这部分要提醒用户检查变量名是否正确,避免拼写错误导致数据无法读取。 保存和测试的时候,用户可能需要使用查看结果树来调试,确认数据是否正确读取。此外,引用里的内容提到CSV数据集相比Redis数据集的使用场景,可能需要提到CSV适合小规模数据,而Redis适合大规模,但用户的问题主要集中在CSV上,所以这部分可以简要带过。 用户可能遇到的问题包括文件路径错误、变量名不匹配或者编码问题,需要给出一些常见问题解决方法。比如使用绝对路径,检查CSV文件编码是否为UTF-8,还有多线程下的数据共享设置。这些细节能帮助用户避免常见的。 最后,生成相关问题的时候,要考虑用户接下来可能想知道的内容,比如参数化方法对比、处理大文件或者分布式测试中的配置。这些问题可以帮助用户进一步学习,提升他们的测试效率。 总结一下,回答的结构应该是先步骤说明,再常见问题,最后相关扩展问题。确保引用正确,比如引用3和4提到CSV Data Set Config的配置和参数化工具,需要在适当的地方标注引用标识。保持语言简洁,用中文,并且行内公式用$符号,不过这个问题可能不太涉及数学公式,所以可能用不上。但按照系统指令,如果有的话要正确使用。现在检查一下步骤是否清晰,有没有遗漏的配置项,比如是否提到Delimiter的设置,或者是否忽略首行等。确认后就可以组织语言回答了。</think>### 如何在 JMeter 中配置 CSV 数据集以用于性能测试 #### **1. 准备 CSV 文件** - 创建包含测试数据的 CSV 文件,格式示例如下: ``` username,password user1,pass123 user2,pass456 ... ``` 文件路径建议使用绝对路径以避免路径错误[^3]。 #### **2. 添加 CSV Data Set Config 组件** - 右键点击线程组 → 选择 `Add` → `Config Element` → `CSV Data Set Config`。 - 关键配置参数: - **Filename**: 输入 CSV 文件路径(如 `C:/data/login_data.csv`)。 - **Variable Names**: 定义变量名,对应 CSV 文件的列(如 `username,password`)[^4]。 - **Delimiter**: 分隔符(默认为逗号 `,`)。 - **Recycle on EOF?**: 数据循环使用(设为 `True` 时,数据用完后从头开始)。 - **Stop thread on EOF?**: 数据结束时停止线程(需与 `Recycle on EOF=False` 配合使用)。 #### **3. 参数化 HTTP 请求** - 在 HTTP 请求中引用变量,例如: - 用户名参数填 `${username}`。 - 密码参数填 `${password}`[^2]。 - 检查变量名是否与 CSV 文件中定义的列名一致。 #### **4. 运行测试并验证** - 使用 `View Results Tree` 监听器查看请求详情,确认数据是否正确替换[^2]。 --- ### **常见问题与优化** 1. **文件路径错误** - 建议使用绝对路径,或通过 JMeter 属性 `${__P(user.dir)}` 获取项目路径。 2. **多线程数据冲突** - 设置 `Sharing Mode` 为 `All threads`(所有线程共享数据)或 `Current thread`(每个线程独立数据)[^4]。 3. **编码问题** - 若 CSV 文件含中文,需在配置中设置 `File Encoding` 为 `UTF-8`。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值