亲自动手系列:linux下配置jmeter 分布式压测
1.需求概述
有很多时候会遇到这样的需求,遇到对压测大型的系统进行压测,一台压力机不够用,需要几十台压力机来联合进行压测,这样就会用到分布式压测的形式;一台master,俗称主控机(controller),再加上N台Slave,俗称压测执行机;有条件的话,master和slave机器分别在不同的机器,也可以在同一台机器;
这里以Centos 环境为例,说明如何配置Jmeter分布式压测;
2.准备工作
第一步:确保脚本在单机上能有效运行,也就是说,脚本在单机上可以执行压力测试;
第二步:在master 和slave 配置相同版本的jdk 、jmeter,以及相同的jmeter路径;
第三步:对Linux操作系统进行优化,主要是tcpip的操作系统参数,主要是为了防止客户端产生大量的TimeWait,而使客户端成为瓶颈;
3.linux环境优化
在执行过程中,可以通过以下命令来监测TCP各状态的数量:
netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'
关闭防火墙:
systemctl disable firewalld
优化内核文件,主要是在 /etc/sysctl.conf 添加以下参数:
vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce=2
net.ipv4.tcp_max_tw_buckets = 5000 //表示系统同时保持TIME_WAIT 套接字的最大数量,如果超过这个数字,Timewait 套接字将立刻被清除并打印警告信息。
net.ipv4.tcp_syncookies = 1 //表示开启 SYN cookies.当出现SYN等待队列溢出时,启用cookies 来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_max_syn_backlog = 1024 //表示SYN队列的长度,默认为1024,可以加大队列长度为 8192 ,可以容纳更多等待连接的网络连接数;
net.ipv4.tcp_synack_retries = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.tcp_tw_reuse=1 //表示开启重用。允许Time_wait sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle=1 //表示开启TCP连接中 TIME-WAIT sockets 的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout=30 //修改系统默认的 timeout 时间
以上选项亲自试验过,如果效果还不理想,还可以加以下参数:
net.ipv4.tcp_keepalive_time =1200 //表示当keepalive 起用的时候,TCP发送 keepalive 消息的频度,缺省是2小时,改为20分钟;
net.ipv4.ip_local_port_range= 1024 65000 //表示用于向外连接的端口范围。缺省情况下很小;32768到61000,改为1024到65000
修改完后,执行 /sbin/sysctl -p 让参数生效;
4.jmeter分布式原理
1.Jmeter分布式测试时,选择其中一台作为主控机(master/Controller),其它机器做为执行机(slave/Agent)
2.执行时,master会把脚本发送到每台slave上,slave 拿到脚本后就开始执行,slave执行时不需要启动GUI;
3.执行完成后,slave会把结果回传给master,master会收集所有slave的信息并汇总。
在本例中,假设两台 slave机为 xx.12.66.64/65 ,由于这两台的配置都还不错,将66.65 作为slave 的同时,也作为master 主机机使用;
5.slave配置
以下以xx.12.66.64为例,其它slave配置类似:
第一步:将Jmeter 传至服务器,并确保单机能正常执行;
第二步:修改bin目录下的 jmeter.properties ,主要修改以下几项:
端口默认为1099 ,也可以改为其他,这里改为9008
server_port=1099
server.rmi.localport=1099
server.rmi.ssl.disable=true //关闭SSL校验,默认是注释掉的;
slave启动:
jmeter-server -Djava.rmi.server.hostname=xx.12.66.64 ,启动 anget 节点。jmeter-server 后面的参数指定 agent 的 IP这里是启动slave上的jmeter服务。
如果如下信息,说明启动成功:
created remote object: xxxxxx
说明anget 节点启动成功了;
当前测试任务启动或结束时,会出现以下信息:
Starting the test on host xxxxx :测试任务开始了
Finished the test on host xxxx :测试任务结束了
备注:
如果觉得上面的启动命令太长记不得,可以在jmeter-server文件中修改以下内容: RMI_HOST_DEF=-Djava.rmi.server.hostname=xx.12.66.64
然后只要在bin路径下输入sh jmeter-server
6.master配置
这里我们选择的master机器为 xx.12.66.65 ,对bin下的jmeter.properties 文件进行修改 ,主要是以下两项:
remote_hosts=xx.12.66.64:9008,xx.12.66.65:9008
server.rmi.ssl.disable=true
7.场景运行
运行命令:
jmeter -n -t test.jmx -R xx.12.66.64,xx.12.66.65 -l test.jtl
或 jmeter -n -t test.jmx -r -l test.jtl
如图:
参数 n:非gui运行
t:指定测试脚本
R:指定多少个 agent 启动并参与测试
r: 代表全部 agent 启动并参与测试
l:生成测试结果文件

浙公网安备 33010602011771号