JMeter实现load distribution

JMeter是一个优秀的负载测试软件,作为一款开源测试工具,从功能上来说,JMeter并不比昂贵的LoadRunner工具缺少太多功能。只是JMeter在UI方面的粗糙和过于灵活的扩展性,导致很多人对其失去信心。

        LoadRunner和其他的商业负载测试工具都有一个“设置用户场景”的功能,该功能允许用户指定一个场景,在该场景中,让指定的用户负载按照一定比例进行分配,例如,我们可以设置一个场景,该场景包括三个测试脚本A,B,C,在场景中可以指定场景的总虚拟用户数为100,其中30个用户(30%)运行A脚本,20个用户(20%)运行B脚本,而50个用户(50%)运行C脚本,这种场景的方式可以很好的模拟真实用户的负载,起到较好的测试效果。

        而JMeter采用的是和大部分商业负载测试工具不同的树状结构来组织负载测试,通过线程组(thread group)、Sampler,以及控制器(Controller)来控制负载测试的进行,于是很多初次使用JMeter的朋友就会认为,JMeter无法支持上文提到的“用户场景”,转而放弃使用该工具。

        其实,JMeter虽然只提供了线程组、sampler、控制器等看似简单的元件(element),但通过这些元件的组合,JMeter可以实现相当强大的功能。接下来,我们就来看看如何通过这些元件,在JMeter中实现和LoadRunner等商业负载测试工具相同的“用户场景”功能。

        说明:以下内容建立在对JMeter的一定了解的基础上,如果不熟悉JMeter的话,不妨先google一下JMeter相关的内容,当然,最好的了解JMeter的方法是通过JMeter自己网站上的手册(英文内容)。

        在JMeter中实现“用户场景”的最主要的元件是“SwitchController”和“Beanshell Sampler”。“Beanshell Sampler”是JMeter中比较灵活的一个Sampler,和普通的Sampler不同,该Sampler并不是简单的发送一个指定协议的数据包,而是可以通过beanshell脚本语言来控制该Sampler的行为(请至http://www。beanshell。org/查看beanshell相关的信息,简单来说,Beanshell是一个基于Java的交互式脚本语言,可以很好的内嵌在其他软件中。Beanshell的语法很类似Java,但比Java更简单和简洁)。需要注意的是,由于license问题,JMeter的binary并没有包含Beanshell解释器的binary,用户需要自行从http://www。beanshell。org/上下载beanshell的解释器(一个jar包)并拷贝到JMeter安装目录的lib目录下。

        而“Switch Controller”则是JMeter中的一个简单的控制器,该控制器的作用仅仅是根据给定的参数的值决定执行该控制器下的哪一个分支。

        注意Switch Controller的“Switch Value”的取值,当该值为0时,线程组在执行到SwitchController之后,接下去执行该节点下的第一个子项,也就是Google。cn这个Sampler;如果该值为1,显然被执行的就是Sina。com。cn这个子项。假设在线程组执行的过程中,每次执行到Switch Controller的时候,我们可以控制SwitchValue的值,则自然就可以控制该Controller下的Sampler的执行次数,也就可以实现我们前文描述的“用户场景”了。

        那么,究竟如何来控制Switch Value呢?JMeter本身是支持变量的,因此,我们可以将Switch Value指定为一个变量,然后使用一段脚本代码来修改该变量的值即可。
         前文我们已经讲到了Beanshell Sampler,我们可以使用该Sampler来产生不同的Switch Value。例如,以下的这段Beanshell代码就可以以一定的概率分别产生0-2之间的整数值:

  1. int rd = Math.random() * 10;
  2. if (rd < 6) 
  3.    vars.put("RAND", "0");
  4. else if(rd < 8)
  5.    vars.put("RAND", "1");

复制代码

        从代码中可以看到,该段代码使用了Java的random函数产生一个[0, 10)之间的整数,当产生的整数位于[0, 6)时给变量$RAND赋值为0;当产生的整数位于[6, 8)时给变量$RAND赋值为1;否则赋值为2。因为random函数本身的随机性可以得到保证,因此很容易计算得出,这段代码将变量$RAND设置为0的概率是60%,设置为1的概率是20%,设置为2的概率也是20%。

        接下来我们在该Switch Controller下给定三个JavaRequest Sampler来测试一下,看看这个测试计划是否能够按照我们的预期方式执行(三个Java Request Sampler的Label分别是“0”,“1”,“2”)。

        从结果中可以看出,$RAND函数被置为0,1,2的次数的确是60%,20%和20%(肯定会有一定的误差,不可能100%精确)。

后记

        JMeter作为当前应用最广泛的负载测试工具之一,其灵活性和可扩充性是最大的优势,商业负载测试工具能够实现的功能,90%以上JMeter都可以实现。而且,JMeter还可以通过简单的方式扩充Sampler来支持各种不同的协议。

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-28 11:19:42

JMeter实现load distribution的相关文章

使用 JMeter 分布式性能测试

作为一个纯 JAVA 的GUI应用,JMeter 对于CPU和内存的消耗还是很惊人的,所以当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起JAVA内存溢出的错误.不过,JMeter 也可以像 LoadRunner 一样通过使用多台机器运行所谓的 Agent 来分担 Load Generator 自身的压力,并借此来获取更大的并发用户数.根据 JMeter官方文档的署名,你需要自己完成这个配置,不过不用担心,这将非常简单 ^_^ 在所有期望运行 JMete

NAT简介

为什么要使用nat 1.内网主机过多,没有足够的合法ip可用 2.当ISP发生变化时,使用nat技术避免了ip地址的重新编址 3.当两个合并的网络中出现了重复地址 4.利用nat可以解决TCP的负责均衡问题 5.隐藏内部网络,增加安全性 nat就是将内网中使用的私有地址转换为可在internat上路由的合法地址技术 私有地址范围: 10.0.0.0-10.255.255.255 172.16.0.0-172.31.255.255 192.168.0.0-192.168.255.255 nat的四

Dynamo: Amazon’s Highly Available Key-value Store

www.allthingsdistributed.com/2007/10/amazons_dynamo.html , 英文版 http://blog.163.com/woshitony111@126/blog/static/71379539201231492557944/ , 中文版   1 Overview Amazon服务平台中的许多服务只需要主键访问数据存储. 对于许多服务, 如提供最畅销书排行榜, 购物车, 客户的偏好, 会话管理, 销售等级, 产品目录, 常见的使用关系数据库的模式会导

Database Tuning Best Practices - A Success Story

Introduction SaaS service providers must always consider the large number of users when designing an appropriate business architecture. The large user base and massive user data require both efficiency and stability in the infrastructure construction

《计算机网络:自顶向下方法(原书第6版)》一2.5 DNS:因特网的目录服务

2.5 DNS:因特网的目录服务 人类能以很多方式来标识.例如,我们能够通过出生证书上的名字来标识:能够通过社会保险号码来标识:也能够通过驾驶执照上的号码来标识.尽管这些标识办法都可以用来识别一个人,但是在特定环境下,某种识别方法可能比另一种方法更为适合.例如,IRS(美国的一个声名狼藉的税务征收机构)的计算机更喜欢使用定长的社会保险号码而不是出生证书上的姓名.另一方面,普通人乐于使用更好记的出生证书上的姓名而不是社会保险号码.(毫无疑问,你能想象人们之间以这种方式说话吗?如"你好,我叫132-

J2EE学习笔记(4) 软件工程与系统框架

J道的老大banq曾经说过设计模式是衡量一个程序员水平高低最重要的标准.个人非常赞同这个观点,从这个角度看学好J2EE第一个要了解的就是作为一个庞大复杂的系统,它是如何由各个模块拼装并协同有效地运作.先来几个定义暖暖身 Definitions of Different Dimensions in J2EE Tiers: A logical or physical organization of components into an ordered chain of service provide

win2012+powershell+win dns 解决网站负载均衡

用Windows powershell,加windows的dns服务器.从调整dns服务器解析ip时间段的角度,解决网站负载均衡问题. win2012r2中,用powershell管理dns服务器的,命令列表PS C:\Users\admin> get-command * -module DnsServer CommandType Name ModuleName----------- ---- ----------Alias Export-DnsServerTrustAnchor DnsServ

《基于MPLS的流量工程(修订版)》一2.2 转发的基本原理

2.2 转发的基本原理 基于MPLS的流量工程(修订版)表2-1通过术语和定义简单介绍了一下MPLS.这一节将会把这些概念结合起来作更深入的介绍. 2.2.1 什么是标签 如你所料,标签是多协议标签交换的一个组成部分.标签使得路由和转发可以分离,这样便于灵活地进行处理. 什么是标签?在定义标签之前,应该知道MPLS可以在两种模式下工作: 帧模式.信元模式.1.帧模式帧模式是指在分组的第三层分组头(例如IP分组头)前加入标签进行转发. RFC 3031,"多协议标签交换体系结构",定义了

YARN加载本地库抛出Unable to load native-hadoop library如何解决

用官方的Hadoop 2.1.0-beta安装后,每次hadoop命令进去都会抛出这样一个Warning WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 设置logger级别,看下具体原因 export HADOOP_ROOT_LOGGER=DEBUG,console 13/08/29