原文地址:http://www.51testing.com/html/78/23978-143163.html

1.测试概要
1.1 关于
这篇文档中涉及的基于JMS的消息系统能为应用程序提供可靠的,高性能的,异步的通讯机制。在不同的JMS解决方案中,性能是关键因素,但不是唯一的因素。每个方案都有不可比拟的属性和特性,还要考虑诸如实现难易、有效性、获得支持的性价比,等等。另外,标准的性能测试只能近似模拟各个企业的特定需求下的真实环境。
1.2 测试人员和工作
测试人:nb_bull
工作量:50小时
1.3 测试方案
基于JMS的消息传递分为两方面,基于队列的点对点模式和对于主题的发布-订阅模式,这次主要针对Topic方式执行测试。
测试中每个发送者和接收者所发送和接收的消息数目都将被记录。数值采样将会从测试系统初始化完成时开始,并在规定的时间段内持续进行,于系统开始关闭前结束.
1.4 测试环境与配置
所有的测试都在两台服务器(主从)上完成,消息消费者和提供者被安装在x86的机器上,配置为2.40G CPU和1.0GB内存,操作系统Windows XP,所有机器在同一个网段的局域网内相连。
1.5 测试场景
1.5.1 集群类型
本次性能测试主要测试比较几种Master-Slave集群配置方案和默认配置,我们对每个JMS项目采用默认的out-of-the-box配置。
a.Pure Master Slave
b.Shared File System Master Slave
c.JDBC Master Slave(DB only)(采用默认数据源)
d.JDBC Master Slave(File&DB)(采用c3P0数据源)
e.单点非集群模式
1.5.2 测试场景
单个提供者,单个用户,和单个主题或队列(1 producer, 1 subscriber, and 1 topic)
1.5.3 消息配置
java.naming.provider.url:tcp://localhost:61616?jms.useAsyncSend=true&wireFormat.maxInactivityDuration=0
消息发布时采用异步发送流(useAsyncSend)模式,加入wireFormat.maxInactivityDuration=0 这样的参数,避免ActiveMQ在一段时间没有消息发送时抛出 "Channel was inactive for too long"异常。
消息内容:
<?xml version="1.0" encoding="UTF-8" ?><message><messageVersion>2</messageVersion><transactionId>17584926994300501924</transactionId><feeCode>2HSKYYXC</feeCode><spcode>11</spcode><phoneNum>13886344486</phoneNum><hsMan>rebound</hsMan><hsType>f420</hsType><vmVer>1940</vmVer><hsVer>101935</hsVer><imei>135790246811220</imei><imsi>460005804931145</imsi><appId>400001</appId><appVer>-1</appVer><feetype>0</feetype><provider>1</provider><reserve>0</reserve><moTime>20090708175847</moTime><cost>2.0</cost><chargeVer>0</chargeVer><application>0</application><module>0</module><appcontext>ABcWEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</appcontext></message>
消息大小646字节,会被消息产生者重复使用。
1.5.4 ActiveMQ相关
部署的ActiveMQ版本为现网部署的5.1.0版本。
采用AMQ Message Store的ActiveMQ缺省持久化存储方式,所有方案持久化使能persistent=”true”,日志等级设置为INFO。持久化时配置增大ActiveMQ缓存大小,<policyEntry queue=">" memoryLimit="100mb"/><policyEntry topic=">" memoryLimit="100mb"/>。
1.5.5.测试方案
方案一:在测试PC1上使用测试脚本往ActiveMQ集群以non-persistent方式异步发布JMS消息,在测试PC2上采用jmeter非持续订阅(non-durable Subscrition)方式接收消息。
方案二:在测试PC1上使用测试脚本往ActiveMQ集群以persistent方式异步发布JMS消息,在测试PC2上采用jmeter非持续订阅(non-durable Subscrition)方式接收消息。
方案三:在测试PC1上使用测试脚本往ActiveMQ集群以persistent方式异步发布JMS消息,在测试PC2上采用开发人员提供的监听模块持续订阅(durable Subscrition)方式接收消息。

2测试结果及缺陷分析
2.1 测试执行情况与记录
2.1.1方案一
Publish: non-persistent, useAsyncSend
Subscrition:non-duration(jmeter listen)
主题模式:1 producer, 1 subscriber, and 1 topic
ActiveMQ集群方案 每秒消息数(msg/sec)
Pure Master Slave 7541
Shared File System Master Slave 7760
 JDBC Master Slave(DB only) 7260
JDBC Master Slave(File&DB) 7681
单点非集群模式 8226
数字代表在每个测试时间间隔中每秒发送的消息数。数值越高代表性能越好。
测试中发布的消息被jmeter迅速接收处理,各种部署方式数据处理性能接近。
2.1.2方案二
Publish: persistent, useAsyncSend
Subscrition:non-duration(jmeter listen)
主题模式:1 producer, 1 subscriber, and 1 topic
ActiveMQ集群方案 每秒消息数(msg/sec)
Pure Master Slave 6663
Shared File System Master Slave 7189
JDBC Master Slave(DB only) 7002
JDBC Master Slave(File&DB) 7052
单点非集群模式 7471
数字代表在每个测试时间间隔中每秒发送的消息数。数值越高代表性能越好。
测试中发布的消息被jmeter迅速接收处理,各种部署方式数据处理性能接近。
2.1.2方案三
Publish: persistent, useAsyncSend
Subscrition:duration(采用开发人员提供的subscription模块)
主题模式:1 producer, 1 subscriber, and 1 topic
ActiveMQ集群方案 每秒消息数(msg/sec)
Pure Master Slave \
Shared File System Master Slave 25
JDBC Master Slave(DB only)默认数据源 3
JDBC Master Slave(File&DB)采用c3P0数据源 22
单点非集群模式 55
该方案采用开发人员提供的订阅模块进行对集群进行持续订阅,测试中可以发现:
1.由于该订阅模块的处理能力较差,导致大量发送数据的堆积拥塞,每秒的处理消息能力糟糕。
2.JDBC模式使用c3P0数据源后,运行效率更加稳定和高效。
3.Pure Master Slave在此测试场景下,由于数据的大量拥塞迅速失去响应。

3测试结论与建议
3.1 测试结论
1.Pure Master Slaver集群方式重新启动MQ服务后原来连着的用户发送订阅消息,MQ会一直提示”Cannot lookup a connection that had not been registered”(ActiveMQ5.1)。
2. JDBC Master Slave(DB only)集群方式使用默认数据源进行测试时,频繁写入数据库,导致性能低下,MQ日志开始频繁报出“ERROR StoreDurableSubscriberCursor   - Failed to get current cursor”的错误信息,JDBC Master Slave(File&DB)集群方式,使用默认数据源进行测试时,系统日志频繁报出“ERROR JournalPersistenceAdapter –Failed to checkpoint a message store: java.util.concurrent.ExecutionException: java.io.IOException: Already started. ”(更换了c3P0数据源后该问题可解决)。

3.Shared File System Master Slave在本次采用activeMQ5.1进行集群测试的时候也发现了一个BUG,在集群运行一段时候后会出现slave MQ的crash,日志显示为“java.io.FileNotFoundException: **/*****/***/******/journal/control.dat (Too many open files)”,在ActiveMQ的网站上找到了该BUG的错误报告。可通过升级到ACtiveMQ5.3或下载一个补丁jar包放到lib的方式来解决。
3.目前开发提供的数据订阅模块在可持续订阅(duration)时处理效率较差,后续需要进行优化。
3.2 部署建议
1.Increase the memory limit of the broker in activemq.xml,在实际上线时需要评估消息发布、接送之间的msg流量差,增大memory limit,如512MB或更大,同时需要注意配置分配给ActiveMQ的JVM内存是大于该配置容量。
2.建议以后对持续订阅模块进行性能评估后再上线部署,以防止消息订阅者性能低下而在ActiveMQ上造成数据堵塞;并保证持续订阅者的稳定性,避免出现长时间掉线的情况,测试证明消息堵塞对MQ性能的影响是很严重的。也可以通过配置消息生存时间、配置自动清除缓存等方式解决该隐患。
3.如果使用数据库模式的话建议使用c3p0的数据源。
4.使用non-persistent 方式速度较快,对于偶尔丢失少量数据不敏感的应用极为适合。

至此,该阶段的集群性能评估已经可以告一段落,完整诊断以后系统性能的瓶颈主要是在持续订阅模块上。而采用c3po数据源后的JDBC Master Slave性能与Shared File System Master Slave 性能比较接近。Pure Master Slave的问题在apache网站上搜索据说该BUG已在ActiveMQ5.2后fixed,不过鉴于该集群方案的稳定性和以及故障后本身固有的处理缺陷暂不采用。

顺便提及jmeter在测试JMS中碰到的几个问题:

1.Jmeter默认的传送方式是同步:在集群时可以在jndi中采用failover:(tcp://172.16.11.241:61616,tcp://172.16.11.242:61616)?jms.useAsyncSend=true这样的方式修改为异步方式。

2.jmeter默认采用非持久(non-persist)发布:这个貌似在发布/订阅模式下无法修改,很奇怪在队列模式下是有该切换选项的。

3.jmeter默认采用非持续(non-duration)订阅:这个也貌似无法修改。

4.jmeter的订阅模块有一个BUG:要使用listen方法监听系统必须先切换到receive方式再切换回来才能生效。

可见jmeter对JMS测试的支持仍然是不够完善的,如果要全面的测试JMS各种发布订阅模型,还是不得不采用手写测试脚本的方法去完成。

使用jmeter对ActiveMQ集群性能方案进行评估--转载的更多相关文章

  1. ActiveMQ集群方案

    集群方案主要为了解决系统架构中的两个关键问题:高可用和高性能.ActiveMQ服务的高可用性是指,在ActiveMQ服务性能不变.数据不丢失的前提下,确保当系统灾难出现时ActiveMQ能够持续提供消 ...

  2. Redis Cluster集群主从方案

    本文介绍一种通过Jedis和Cluster实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.8.0(推荐),Redis3.0及以上版本(强制). 附:Redis Cluster集群主 ...

  3. ActiveMQ集群简单测试+eclipse Zookeeper 插件 + 负载均衡

    ActiveMQ集群搭建好之后,接下来就该测试一下了. 一.先安装Zookeeper 的eclipse插件吧. 1. 打开 eclipse, Help -> Install New Softwa ...

  4. ActiveMQ集群

    1.ActiveMQ集群介绍 1.为什么要集群? 实现高可用,以排除单点故障引起的服务中断 实现负载均衡,以提升效率为更多客户提供服务 2.集群方式 客户端集群:让多个消费者消费同一个队列 Broke ...

  5. 47.ActiveMQ集群

    (声明:本文非EamonSec原创) 使用ZooKeeper实现的Master-Slave实现方式,是对ActiveMQ进行高可用的一种有效的解决方案,高可用的原理:使用ZooKeeper(集群)注册 ...

  6. ActiveMQ集群整体认识

    出自:https://segmentfault.com/a/1190000014592517 前言 最终需要掌握 Replicated LevelDB Store部署方式,这种部署方式是基于ZooKe ...

  7. 消息队列--ActiveMQ集群部署

    一.activeMQ主要的部署方式? 1,默认的单机部署(kahadb) activeMQ默认的存储单机模式,如果配置文件不做修改,则默认使用此模式.以本地的kahadb文件的方式进行存储,性能完全依 ...

  8. 4 种高可用 RocketMQ 集群搭建方案!

    背景 笔者所在的业务线,最初化分为三个服务,由于业务初期业务复杂度相对简单,三个业务服务都能很好的独立完成业务功能. 随着产品迭代,业务功能越来越多后慢慢也要面对高并发.业务解耦.分布式事务等问题,所 ...

  9. Redis 中常见的集群部署方案

    Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...

随机推荐

  1. Hadoop学习记录(7)|Eclipse远程调试Hadoop

    1.创建Hadoop项目 2.创建包.类 这里使用hdfs.WordCount为例 3.编写自定Mapper和Reducer程序 MyMapper类 static class MyMapper ext ...

  2. 怎么从sqlserver 数据库导出 insert 的数据语句

    In SSMS in the Object Explorer, right click on the database right-click and pick "Tasks" a ...

  3. Sql group by 分组取时间最新的一条数据

    with MiPriceTopOne as (select classid,max(dataTime) dataTime,max(id) as id from MiPrice group by cla ...

  4. dbcp 是什么

    Many Apache projects support interaction with a relational database. Creating a new connection for e ...

  5. JDBC和JPA调用储存过程 接收存储过程有返回值

    ============jdbc==========================================--java代码:一个输出参数--String connURL = null;Con ...

  6. Linux syslog 学习

    最经有在看lighttpd facgi相关的东西.在lighttpd官网上看到如下sample code. #include <stdlib.h> #include <string. ...

  7. lbs basic mongodb

    MongoDB地理位置索引常用的有两种. db.places.ensureIndex({'coordinate':'2d'}) db.places.ensureIndex({'coordinate': ...

  8. android 解释dp,px,pt,sp单位

    1.dp(dip):不同设备有不同的显示效果,这个和设备硬件有关系,一般我们为了支持WVGA,HVGA和QVGA对剑使用这个,它是不依赖像素的 2.px:pixels(像素),不同设备显示效果相同,一 ...

  9. (剑指Offer)面试题20:顺时针打印矩阵

    题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, 例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...

  10. jsp中使用动态数据进行mySQL数据库的两种操作方法

    使用动态数据进行数据库内容的增删改查操作有两种方法: 在此定义数据库连接为conn 假设有表单进行数据输入并提交到处理页面一种是使用预编译格式: 其格式如下: String name = reques ...