jmeter 分布式压测配置Linux

jmeter 分布式压测配置Linux,第1张

本文只讲jmeter分布式压测怎么在Linux环境下配置

使用分布式压测,是因为单个压测机并发到不到系统要求,所以多个压测机同时去压。

一般是由一个主机(master)和几台压力机(slave)组成。

主机 主要是起到启动和收集结果功能(当然也可以参与压测但不建议),测试脚本jmx在这台机器下,执行的时候会发送给每台压力机。

压力机 主要接受主机发送的压测脚本,同时进行压测,并把结果回传给主机。

以下是本人的压测环境,可以参考的去配置:

都是在Linux环境下(有些是主机Windows,压力机Linux,都是这样配置)

master主机:10.244.162.8

slave压测机(三台):10.244.162.9,10.244.162.10,10.244.162.11

主机ping一下压测机,是否可以ping通,否则关闭防火墙或者多个网卡(一台机器可能配置多个网卡多个IP,尤其是Windows当做主机)。

jdk,jmeter安装在主机和压力机下,尽量版本统一,jmeter在这几个机器服务都可以启动jmeter -v,如果权限不够到bin/目录下,命令: chmod 777 jmeter jmeter-server jmeter.sh 。(安装比较简单,这里就不多赘述)

保存。

在apache-jmeter-5.1.1/bin下执行./jmeter-server(代表jmeter启动,监听状态,等待主机发送测试脚本和执行命令) ,

有些启动命令:./jmeter-server -Djava.rmi.server.hostname=10.244.162.10(当前机器的ip),我觉得都行,没编辑配置文件那一项这样启动。

启动就设置完成。

如果是Windows当主机,重启一下jmeter在运行-远程启动既可以看到压测机。

如果是Linux下主机,需要用到命令:

我是在测试jmx脚本的目录下执行,这样方便收集信息。

sh (jmeter启动)  -n -t (jmx脚本) -R  (压力机ip,多个中间用英文逗号隔开) -l (test.jtl)  -e -o  (压测报告结果html文件夹)

sh /app/apache-jmeter-5.2.1/bin/jmeter.sh -n -t test.jmx -R 10.244.162.9,10.244.162.10 -l test.jtl  -e -o  test

注意:主机只传jmx给压力机,如果压测脚本有引用变量文件,比如csv,txt文件等是不传的,压力机也要有这些变量文件,复制过去存放的目录和上面压力机./jmeter-server启动的目录一致(就是你在哪个目录启动的就放在哪个目录下),否则压力机找不到变量文件,执行会报错或者直接结束无测试结果。

在Linux环境,使用jmeter压测会遇到很多问题,比如:配置不对,权限不足这些都是很好解决。 但是遇到这几个问题: 1.内存泄漏   2.端口不够 遇到两个问题网上解决办法都很杂 ,没有一个清晰明了的解决办法,所以针对这两个问题,写出解决办法: 例如: 屏蔽“聚合报告”“查看结果数”,等插件脚本尽量最小变量 ,多个线程组下CSV文件设置,如果 只在当前线程组 使用变量,尽量不使用“全部现场”。 bin/下的jmeter文件(非jmeter.sh)编辑:(Windows环境编辑jmeter.bat) JVM_ARGS="-Xms4g -Xmx4g" 还有另一个方法:启动加参数设置:JVM_ARGS="-Xms2048m -Xmx2048m" jmeter -t test.jmx (上面调整内存格式可以1g 2g,也可以1024m 2048m,这样写都可以)Response code: Non HTTP response code: java.net.BindException Response message: Non HTTP response message: Address already in use: connect Linux本来的默认的端口欧范围:1024-65535,64511个,所以当压测接口调用超过65535个就会出现端口不够的问题。 查Linux支持多少端口, cat /proc/sys/net/ipv4/ip_local_port_range 然后找运维修改,或者: 修改文件  /etc/sysctl.conf 键入如下语句: net.ipv4.ip_local_port_range = 1024 65535压测过程还有其他问题,比如宽带限制,负载均衡,关闭缓存等,多百度即可。

经常有客户问XMeter君,就是单个JMeter能最大支持多少虚拟用户?这个问题其实很难给出一个很准确的答案。因为虚拟用户本身是一个抽象的概念,每个虚拟用户可以是模拟不同的协议。就像如果别人问某个容器能装多少东西这种问题,因为东西本身不确定的话,你也无法给出一个确定的答案。当然了,容器大小本身是确定的,我们只能说在给定的容器的范围内,是否有一些方式来优化,能够让一个容器装下更多的一个确定的东西。毕竟有的时候如果把所有潜能发挥出来,还是很可观的呢。那言归正传,XMeter君带大家来看看JMeter有哪些地方可以优化。

限制JMeter上模拟的虚拟用户的瓶颈主要有计算资源(CPU),存储(内存)和 *** 作系统资源的限制等,下面分开讲述。

计算资源主要指的就是CPU,不同的测试脚本对CPU的使用可能会有很大的差别。在编写、执行测试脚本的时候可以考虑下面的一些问题。

1)JMeter脚本在运行过程中应该避免循环执行大量计算的工作:比如测试脚本中每个虚拟用户循环使用了BeanShell对数据进行处理,如果真的有此需求的话,建议使用扩展function。读者可以参考XMeter君写的 这篇文章 来比较BeanShell和原生function的处理效率。或者准备数据的部分是不是只需要执行一次?比如将这部分逻辑放在“只执行一次”控制器里。

2)JMeter在UI模式下运行也会消耗更多的CPU资源,建议脚本调试通过之后,实际运行测试的时候通过在命令行下来运行测试脚本

3)JMeter的各种图形化的监听器也会消耗CPU资源,在实际的测试运行过程中可以把这些不必要的监听器都关闭,只保留必要的监听器

在自己实现插件的时候,需要考虑实现比较高效的一些算法,如果一个比较差的算法导致耗费额外的CPU,上千个线程累计起来是非常可观的,所以在插件实现一些偏计算的方面模拟的时候,一定要做到精打细算。

存储主要指的就是内存。JMeter是由Java实现的,而Java应用吃内存大家都觉得是很正常,但是这部分是否有优化的空间呢?答案是肯定的。JMeter和普通的Java应用程序一样,启动后使用的内存主要包括两个部分栈和堆。

1)栈空间主要用于分配在方法调用过程中压入栈的方法调用的参数值等。栈空间的使用是和线程数目基本上成正比的,Java 8中缺省每个线程会分配1MB的栈空间。如果使用的是32位的系统,由于一个进程的寻址空间为4GB,假设系统还需要留1GB的内存空间,那么就算把所有的内存都分配给栈,最多也就是能创建3000个线程。当然,如果是使用了64位的系统的话,基本上就没有这个限制了(实际上还受限于 *** 作系统的一些软配置,本文稍后会提及)。假如你的测试脚本(实际上取决于插件的实现)并没有递归等复杂的栈调用,那么可以把每个线程所需的栈空间调小。调每线程栈空间的使用可以通过打开jmeter.sh/jmeter.bat,通过加入下面的语句来解决,例子中的配置的意思是每线程使用400KB的栈空间,比缺省的1MB节省了约60%,对于需要创建大量的线程的JMeter来说,节省的空间还是比较可观的。但是实际上在运行过程中,栈空间的使用也不完全是线性的,JVM或者 *** 作系统可能在某些地方还是共享了一些栈空间,具体的节省下来的栈空间需要通过试验才能得到准确的数值。

2)堆则包括分配对象实例所需要的静态变量、类变量等。这部分所用的内存取决于插件的实现,比如每个Sampler所依赖的对象的大小等。这部分空间的调整可以通过设置Xmx参数来实现。做法还是通过打开jmeter.sh/jmeter.bat,下面的例子的意思是上来就在堆空间上分配15GB内存,最大可以使用的堆的空间的大小也是15GB。

在自己实现JMeter插件的时候应该仔细考虑以上的问题,比如避免在Sampler中再单独启动线程,因为这么做会使每个虚拟用户创建额外的一个线程,从而可能导致在同样的配置下,你实现的插件创建少一半的虚拟用户!比较好的做法是所有虚拟用户通过一个线程来处理,不过这样也会导致多线程之间数据使用的冲突等问题,读者需要根据自己的情况酌情处理。针对堆空间的使用,如果有比较占存储空间的类变量,可能尽量多线程共享一份数据(比如通过静态变量等),而不是每线程创建自己的实例,当然还是需要考虑多线程访问的时候变量保护的问题。

*** 作系统的缺省配置可以满足大部分用户的日常使用,而性能测试往往会突破这些 *** 作系统默认的配置。常见的包括文件、端口限制等。本文以CentOS为例,介绍如何优化这些配置。

1)设定每个进程可以打开的最大文件描述符的数量,由于在Linux中一个socket连接也是文件描述符,而性能测试过程过程中往往测试的时候也需要生成一个socket连接,因此该参数的设置会影响到最大模拟的虚拟用户数。

2)设置系统可用的socket端口号,每台机器最多可用的端口号为65535,在测试机器上可能某些系统的端口已经被占用,因此用户可以设置可用的端口号段来增加可用的端口。如下例所示可用的端口号为15000至61000,那么最多的可用端口号数目为46000个。如果需要设置Docker容器中的该配置,需要在特权模式下才能对其进行配置,否则该项配置是只读的(docker run --privileged)

3)tcp_tw_reuse表示可以复用处于TIME_WAIT状态的连接,对于在性能测试过程中可能产生的大量临时的短连接,该选项可以重用连接,而不用等待连接的完全释放,从而能提高支持的并发用户数目。tcp_tw_recycle用于回收处于TIME_WAIT状态的连接,也可以提高连接的使用率。

4)提高线程的使用限制。pid_max用于控制 *** 作系统线程ID的最大值,该值会影响可以创建的最大的线程数目。max_map_count单进程mmap的限制会影响当个进程可创建的线程数,需要将该值也提高以支持创建更多的线程。

通过上文的介绍,读者可以对JMeter运行环境做一些比较常见的优化。针对不同的测试,读者还是需要分析不同的场景,针对压力发起机的实际情况分别进行优化,以提高单台机器上模拟的并发用户数目。如果使用XMeter平台,我们对压力机已经进行了配置优化,避免测试人员纠结于类似的底层系统的配置,只需将精力放在测试业务逻辑的编写和调试,执行的事情交给XMeter平台就可以了,因此能极大地提高测试的工作效率。

什么限制了创建Java线程的数量 :本文中介绍了更改栈大小的配置对生成的线程个数的影响

Java栈大小的设置 :与上文类似,介绍如何设置Java的栈大小

Linux中能创建的最大线程个数 : 本回答介绍的在Linux中对创建线程个数影响的一些配置


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8944507.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存