使用JMSTester对JMS层进行基准测试

对于我去过的大多数客户端,使用ActiveMQ扩展JMS消息传递层是一个优先事项。 有多种方法可以实现这一目标,但毫无疑问,创建基准测试并在实际硬件上分析架构(或者正如我的同事Gary Tully所说的“询问机器”)是第一步。 但是,对于创建一套全面的基准测试,您有哪些开源选择?

如果您有一些好的经验,请在评论中让我知道。 我能想到的项目:

  • 阿帕奇Jmeter
  • ActiveMQ性能插件
  • FuseSource JMSTester
  • Hiram Chirino的jms基准

在与Gary谈谈为ActiveMQ设置测试方案时,他回忆起一个非常有趣的项目,似乎停滞在名为JMSTester的FuseSource Forge 存储库中 。 他建议我看看它。 我做到了,它的当前功能给我留下了深刻的印象。 它是由前FuseSource顾问Andres Gies创建的,它通过与客户,航班和业余时间黑客的多次迭代而创建。 从那以后,我将接管它,并且我将添加功能,测试,文档,并继续保持它曾经拥有的动力。

但是,即使在我无法发挥自己的创造力之前,我也想与您分享它目前拥有的力量。

目的

此博客文章的目的是对JMSTester工具进行类似教程的介绍。 该工具的目的是提供一个功能强大的基准测试框架,以创建灵活的分布式JMS测试,同时在进行调整和调整JMS层之前监视/记录至关重要的现有统计数据。

JMSTester主页上的某些文档有些过时,但是描述某些基准的步骤仍然是准确的。 本教程将要求您下载我一直在努力的SNAPSHOT,可以在这里找到: jmstester-1.1-20120904.213157-5-bin.tar.gz 。 我将很快部署网站的下一个版本,该网站应具有更多的二进制更新版本。 当我这样做时,我将更新这篇文章。

符合JMSTester工具

JMSTester工具只是发送和接收JMS消息的工具。 您可以使用spring上下文配置文件中定义的配置文件来指定要在消息代理上引发的负载类型。 JMSTester允许您定义想要使用的生产者的数量,使用者的数量,连接工厂,JMS属性(事务,会话ack等),但是真正很酷的部分是您可以运行分布在许多机器上的基准测试。 这意味着您将机器设置为专门充当生产者,而将其他机器设置为充当消费者。 至于监视和收集用于基准测试的统计信息,JMSTester捕获三种不同类别的信息:

  1. 基本:每个使用者的邮件数,邮件大小
  2. JMX:在测试运行时监视代理上的所有JMX属性,包括线程数,队列大小,入队时间等
  3. 机器:CPU,系统内存,交换,文件系统指标,网络接口,路由/连接表等

它们的Hyperic SIGAR库用于捕获计算机级别的统计信息(第3组),而RRD4J库用于记录统计信息和输出图形。 目前,我认为这些图形非常基础,希望对此进行改进,但是原始数据始终会转储到csv文件中,您可以使用自己喜欢的电子表格软件来创建自己的图形。

建筑

JMSTester工具由以下概念组成:

  • 控制者
  • 客户群
  • 录音机
  • 前端
  • 基准配置

控制者

控制器是基准的组织者。 它跟踪谁对基准命令感兴趣,启动测试,跟踪使用者数量,生产者数量等。基准在没有控制器的情况下无法运行。 对于您感兴趣的人,JMSTester工具的基础体系结构依赖于消息传递,而ActiveMQ是控制器启动的代理,以便其余体系结构正常工作。

客户群

客户端是接受命令的容器,可以模拟生产者消费者或两者的角色,或两者都不起作用(这在以后很有意义)。 您可以根据需要拥有任意数量的客户。 您可以给它们指定唯一的名称,并在基准配置文件中使用它们的名称。 客户端可以在任何地方运行,包括在单独的计算机上或全部在一台计算机上运行。

录音机

客户端分别记录统计信息并将数据发送到记录器。 记录器最终将统计信息组织起来,并组装图形,RRD4J数据库和基准csv文件。

前端

前端向控制器发送命令。 现在只有一个命令行前端,但是我的意图是包括一个基于Web的前端和一个基于REST的控制器,该控制器可用于运行基准测试。

基准配置

配置文件是Spring上下文文件,用于指定指示控制器和客户端如何运行基准测试的bean。 在这些配置文件中,您还可以指定要捕获的度量标准以及发送给JMS代理的消息加载类型。 展望未来,我的目标是改善这些配置文件,包括添加自定义名称空间支持以使配置不再那么冗长。

我们走吧!

JMSTester网站上有一些很好的入门教程:

  • 简单:http://jmstester.fusesource.org/documentation/manual/TutorialSimple.html
  • JMX探针:http://jmstester.fusesource.org/documentation/manual/TutorialProbes.html
  • 分布式:http://jmstester.fusesource.org/documentation/manual/TutorialDistributed.html

它们大多是最新的,但是当我发现错误时,我将继续对其进行更新。

关于分布式教程的唯一一件事,实际上并没有建立分布式示例。 它分离出客户端,但仅在同一台本地主机上。 只需设置几个其他参数即可分发它,我们将在这里介绍。

本教程的体系结构如下:

让我们真正快速地理解该图。

JMS主机将运行两个进程:我们将测试的ActiveMQ代理,以及名为Monitor的JMSTester客户端容器。 容器既不是生产者也不是容器,而是仅用于监视机器和JMX统计信息。 统计信息将被发送回控制器主机上的记录器,如上面“记录器”部分所述。 ProducerConsumer容器将在分别命名为ProducerConsumer的单独机器上运行。 最后, Controller主机将具有分布式测试的ControllerRecorder组件。

最初设定

在将要参与基准测试的每台计算机上下载并提取JMSTester二进制文件。

启动Controller和Recorder容器

在将承载控制器的机器上,导航至$ JMSTESTER_HOME目录,然后键入以下命令以启动控制器和记录器:

./bin/runBenchmark -controller -recorder -springConfigLocations conf/testScripts

请注意,所有内容都必须与上面完全一样键入,包括“ conf / testScripts”上没有尾随空格
在以后的增强中,我将缓解这种特殊性。

启动控制器和记录器后,就应该准备启动其余的客户端了。 控制器启动客户端最终将连接到的嵌入式代理。

启动生产者容器

在将托管生产者的机器上,导航到$ JMSTESTER_HOME目录,然后键入以下命令:

./bin/runBenchmark -clientNames Producer -hostname domU-12-31-39-16-41-05.compute-1.internal

对于-hostname参数,必须指定启动控制器的主机名。 我在上面使用的是Amazon EC2 ,如果您要这样做,则更愿意为主机使用内部DNS名称。

启动使用者容器

对于使用者容器,除了为其提供客户名称“ Consumer”外,您将执行与生产者相同的操作

./bin/runBenchmark -clientNames Consumer -hostname domU-12-31-39-16-41-05.compute-1.internal

同样, -hostname参数应该反映您正在其上运行控制器的主机。

在JMS主机上设置ActiveMQ和监视器

设置ActiveMQ超出了本文的范围。
但是您将需要在代理上启用JMX。 只需按照 Apache ActiveMQ网站上的说明进行操作即可 。

下一部分是必需的,以允许进行机器级别的探测/监视。 您需要安装SIGAR库。 由于它们的许可证,它们不随JMSTester一起分发,并且它们的JNI库在Maven中不可用。 基本上,您所需要做的就是下载并从此处提取[SIGAR发行版] [sigar-distro],然后将所有库从$SIGAR_HOME/sigar-bin/lib文件夹复制到$ JMSTESTER_HOME / lib文件夹中。

现在,使用针对生产者和消费者的类似命令启动Monitor容器:<

./bin/runBenchmark -clientNames Monitor -hostname domU-12-31-39-16-41-05.compute-1.internal

提交教程测试用例

我们可以从任何计算机上提交测试用例。 我选择从本地计算机上执行此操作。 您会注意到,提交测试用例的计算机未在上方的图中反映出来; 这仅仅是因为我们可以在任何机器上做到这一点。 就像其他命令一样,您仍然需要JMSTester二进制文件。

在运行测试之前,让我们快速看一下指定测试的Spring配置文件。 为此,请在您最喜欢的文本编辑器中打开$ JMSTESTER_HOME / conf / testScripts / tutorial / benchmark.xml,最好使用一种对XML文档进行颜色编码的代码,以便于阅读。 该基准文件带有大量注释,这些注释清楚地描述了各个部分。 如果不清楚,请ping我,以便我提供更多详细信息。

在配置中有几个地方,您需要指定自己的值以使其成功进行测试。 不幸的是,目前这是一个手动过程,但我计划对其进行修复。

看一下JMS代理连接工厂的创建位置。 在这种情况下,将在其中创建ActiveMQ连接工厂(第120和124行)。此处的URL是您在前面的部分之一中启动的ActiveMQ代理的URL。 分发后,其中就有一个EC2主机URL。 您必须指定自己的主机。 同样,如果使用EC2,则首选内部DNS名称。

然后,看一下第169行,其中指定了AMQDestinationProbe。 该探针是针对ActiveMQ的JMX探针。 您必须更改brokerName属性以匹配启动它时命名的代理名称(通常在代理配置的<broker brokerName='name here'>部分中找到)。

最后,从$ JMSTESTER_HOME目录中,运行以下命令:

./bin/runCommand -command submit:conf/testScripts/tutorial -hostname ec2-107-21-69-197.compute-1.amazonaws.com

同样,请注意,我将-hostname参数设置为运行控制器的主机。 在这种情况下,我们将更喜欢EC2的公共DNS,但这将取决于您的环境。

输出量

你有它。 您已将测试用例提交给基准框架。 您应该在每个客户端(生产者,消费者,监视器)以及控制器上看到一些活动。 如果您的测试正常运行,并且所有原始数据和图形均已生成,那么您应该会看到类似于日志记录输出的内容:

Written probe Values to : /home/ec2-user/dev/jmstester-1.1-SNAPSHOT/tutorialBenchmark/benchmark.csv

请注意,所有结果都写入到tutorialBenchmark中 ,该名称是测试的名称,由第18行的Spring配置文件中的BenchmarkId定义:

<property name='benchmarkId' value='tutorialBenchmark'/>

如果您看一看benchmark.csv文件,您将看到收集的所有统计信息。 收集的本教程的统计信息包括:

  • 邮件数
  • 讯息大小
  • JMX队列大小
  • JMX线程计数
  • SIGAR CpuMonitor
  • SIGAR免费系统内存
  • SIGAR系统总内存
  • SIGAR免费交换
  • SIGAR总掉期
  • SIGAR交换页面
  • SIGAR换页
  • SIGAR磁盘读取(以字节为单位)
  • SIGAR磁盘写入(以字节为单位)
  • SIGAR磁盘读取
  • SGIAR磁盘写入
  • SIGAR Network RX BYTES
  • SIGAR Network RX PACKETS
  • SIGAR Network TX BYTES
  • SIGAR Network RX已删除
  • SiGAR Network TX已删除
  • SIGAR Network RX错误
  • SIGAR Network TX错误

而已

我强烈建议您看一下这个项目。 我已经接手了它,并将在时间允许的情况下对其进行改进,但是我非常重视关于如何改进它或支持哪些用例的任何想法或建议。 看一下已有的文档,我们将继续添加更多文档。
如果您有问题,或者如上所述无法正常运行,请给我发评论,发电子邮件或在Apache IRC频道中找到我……我通常至少处于#activemq和#camel状态。

祝您编程愉快,别忘了分享!

参考:在Christian Posta Software博客上,使用来自我们JCG合作伙伴 Christian Posta的FuseSource提供的开源JMSTester工具对JMS层进行基准测试 。


翻译自: https://www.javacodegeeks.com/2012/09/benchmarking-jms-layer-with-jmstester.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Js引擎解析执行 阅读笔记

Js引擎解析执行 阅读笔记 一篇阅读笔记http://km.oa.com/group/2178/articles/show/145691?kmrefsearch&from_page1&no1 早期:遍历语法树 Js引擎最早使用的是遍历语法树方式 &#xff08;syntax tree walker&#xff09; 分为两步 词法分析语法分析词法分析 i a b *…

红外线遥控c语言程序,红外遥控的C程序

红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成.引导码是告诉接收机准备接收红外遥控码.系统码是识别码,不同的遥控芯片有不同的误别码,以免搞错.遥控器上不同的按键有不同的键码,系统码和键码都是16位码…

Retrofit2 完全解析 探索与okhttp之间的关系

转载请标明出处&#xff1a; http://blog.csdn.net/lmj623565791/article/details/51304204&#xff1b; 本文出自:【张鸿洋的博客】 之前写了个okhttputils的工具类&#xff0c;然后有很多同学询问这个工具类和retrofit什么区别&#xff0c;于是上了下官网&#xff0c;发现其底…

不变性真的意味着线程安全吗?

我经常阅读有关“如果对象是不可变的&#xff0c;则它是线程安全的”的文章。 实际上&#xff0c;我从未找到过一篇让我相信不变的意味着线程安全的文章。 即使是Brian Goetz的Java Concurrency in Practice一书中关于不变性的一本书也没有完全令我满意。 在这本书中&#xff0…

c语言设计 数组的知识点,C语言程序设计知识点及示例.pdf

C语言程序设计知识点及示例四川大学锦江学院C语言程序设计知识点及示例知识点1&#xff1a;除了复合语句而外&#xff0c;C语言的语句都以分号结束。示例1&#xff1a;C语言的简单语句 (非复合语句语句)必须以 结束。参考答案&#xff1a;分号知识点2&#xff1a;目标程序和可执…

移动端知识汇总

参见地址: https://github.com/jtyjty99999/mobileTech 转载于:https://www.cnblogs.com/duanyue/p/7337789.html

在移动端设置overflow:hidden禁止滚动的解决方法

如果你是将overflow:hidden用在了body上那么不管用&#xff0c;因为移动端是基于touch事件。 两种解决方法&#xff1a; 1、为html和body同时设置height:100%;overflow:hidden; html, body{height:100%;overflow:hidden; }2、使用touchmove $(document).on(touchmove,function …

单元测试线程代码的5个技巧

这是一些技巧&#xff0c;说明如何进行代码的逻辑正确性测试&#xff08;与多线程正确性相对&#xff09;。 我发现本质上有两种带有线程代码的刻板印象模式&#xff1a; 面向任务–许多短期运行的同类任务&#xff0c;通常在Java 5执行程序框架内运行&#xff0c; 面向流程–…

jsp2

D:\Software\Tomcat7\work\Catalina\localhost 是缓存目录&#xff0c;可以删掉隐藏域&#xff1a;页面表单中的一个元素&#xff0c;跟文本框一样&#xff0c;但是用户看不到1.建立test1--form表单需要它&#xff0c;而不需要用户看到&#xff0c;用隐藏域<body><%re…

MongoDB MapReduce 的示例。

// JavaScript source code db.runCommand({mapreduce: "page",map: function Map() {emit(this.title, // how to group{ name: this.name } // associated data point (document));},reduce: function Reduce(key, values) {//reduce用来处理group出来是多条数…

c语言长空格的代码是什么,c语言中表示空格的是什么代码?

分析如下&#xff1a;不是所有字符都需要转义的&#xff0c;空格直接就敲空格&#xff0c;或者使用ASCII码值赋值为32。空格没有转义字符。合法转义字符如下&#xff1a;\a 响铃(BEL) 、\b 退格(BS)、\f 换页(FF)、\n 换行(LF)、\r 回车(CR)、\t 水平制表(HT)、\v 垂直制表(VT)…

使用NoSQL实现实体服务–第1部分:概述

在过去的几周中&#xff0c;我一直在进行一些研发工作&#xff0c;以了解使用NoSQL数据库实现实体服务 &#xff08;也称为数据服务&#xff09;的优势。 实体服务是托马斯埃尔&#xff08;Thomas Erl&#xff09;的《服务技术》丛书中提出的服务分类。 它用于描述高度不可知和…

IO注意事项

read()方法返回值为什么是int? 因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111,那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不…

c语言用星号输出沙漏,《算法笔记》学习日记——3.3 图形输出

3.3 图形输出问题 A: 输出梯形题目描述输入一个高度h&#xff0c;输出一个高为h&#xff0c;上底边为h的梯形。输入一个整数h(1<h<1000)。输出h所对应的梯形。样例输入web5样例输出数组*********************************************思路这一类的题目都比较简单&#xf…

JavaOne 2012:101种改进Java的方法-开发人员参与为何如此重要

Bruno Souza &#xff0c; Martijn Verburg和Heather Vancura在希尔顿酒店的大陆宴会厅4中展示了“ 101种改进Java的方法&#xff1a;开发人员参与为何如此重要”。 他们将其分为自己最熟悉的领域。 SouJava的创始人兼协调员 Souza谈到了通过用户组的更大参与。 Verberg也在伦敦…

Java组合实体模式~

组合实体模式用于EJB持久化机制。 组合实体是表示对象图的EJB实体bean。 当组合实体更新时&#xff0c;内部依赖对象bean将自动更新为由EJB实体bean管理。 以下是组合实体Bean的参与者。 组合实体 - 它是主要的实体bean。 它可以是粗粒度的或可以包含用于持久性目的的粗粒度对象…

python中的一些小知识

在最近学习python中遇到的一些小问题汇总一下&#xff1a; 1.在windows7下安装python3.5版本时提示安装不了&#xff0c;缺少ServicePack1. 解决办法是&#xff0c;打开控制面板\系统和安全\Windows Update&#xff0c;下载和更新计算机安装&#xff0c;然后卸载以前的python版…

在Java中衡量执行时间– Spring StopWatch示例

有两种方法可以通过使用System.currentTimeinMillis&#xff08;&#xff09;或通过使用System.nanoTime&#xff08;&#xff09; 来测量Java中经过的执行时间 。 这两个方法可用于测量 Java中两个方法调用或事件之间的经过时间或执行时间 。 计算经过的时间是Java程序员要做的…

c语言getch在哪个头文件,用getch()需要头文件吗?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include "string.h"#includeusing namespace std;struct student{ int num;char name[10];char banji[10];float score[3];struct student *next;};struct student *creat(){struct student *head,*p…

My solution for Git Client Error: Permission denied (publickey)

在使用Git客户端的过程中遇到的问题以及解决方案分享。 我之前已经安装Git客户端并且使用Git开发过公司项目&#xff0c;也已经正确生成PublicKey并且添加到SSH keys on github of my account&#xff0c;但是当我想从github上克隆另一个客户端push的代码的时候一直报错&#x…