论坛首页 Java企业应用论坛

ActiveMQ 吞吐量如何优化

浏览 17087 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-11-25   最后修改:2011-11-25
最近公司想对公司应用结构进行优化,对现在架构中很多耗费资源严重且耗时比较长的应用间大数据量同步通信的接口进行优化,讨论决定引入消息中间件,网上浏览了一圈最后锁定ActiveMQ,在网上看到很多关于ActiveMQ的测试分析文档,大部分测试结果 AMQ的每秒吞吐量大概都在2000以上甚至更多,但是我在公司服务器上面测试的数据并不是很理想,有点让人头疼,不能够达到峰值,甚至在多线程下速度极速下降,效率方面有点不能让人接受,想看看有没有更好的优化配置。
下面是我的Amq的配置:
  [size=large;]
  单机服务器:CPU :8个
  内存:16G
  系统:Linux Red Hat
  Amq版本:5.5.1
[/size]
${activemq_base}/conf/activemq.xml :配置

[color=blue]<broker xmlns="http://activemq.apache.org/schema/core" brokerName="pure_master"
			 destroyApplicationContextOnStop="true"
			 persistent="true" useJmx="true">
              
        <destinationPolicy>
            <policyMap>
				<policyEntries>
					<policyEntry topic=">" producerFlowControl="false" memoryLimit="16mb" optimizedDispatch="true">
							<dispatchPolicy>
							<strictOrderDispatchPolicy />
							</dispatchPolicy>
							<subscriptionRecoveryPolicy>
							<lastImageSubscriptionRecoveryPolicy />
							</subscriptionRecoveryPolicy>
					 </policyEntry>
					<policyEntry queue=">" producerFlowControl="false" memoryLimit="16mb" optimizedDispatch="true">
						 
					</policyEntry>


				  </policyEntries> 
            </policyMap>
        </destinationPolicy> 
 
        
        <managementContext>
            <managementContext createConnector="false"/>
        </managementContext>

        
        <persistenceAdapter>
            <kahaDB directory="/opt/activemq_data/kahadb_master"  indexWriteBatchSize="1000" journalMaxFileLength="32mb" enableIndexWriteAsync="true" enableJournalDiskSyncs="false"/>
        </persistenceAdapter>
        
             
        <systemUsage>
            <systemUsage sendFailIfNoSpaceAfterTimeout="3000">
                <memoryUsage>
                    <memoryUsage limit="128 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="15 gb" name="dbstore"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="128 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>
	        <transportConnectors>
            <transportConnector name="openwire" uri="tcp://192.168.2.215:61616"/>
        </transportConnectors>

    </broker>

       <import resource="jetty.xml"/>[/color]


JVM设置:

[color=black] /opt/java/jdk1.6.0_29/bin/java -server -Xmx2g -Xms2g -XX:SurvivorRatio=8 -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:ErrorFile=/opt/mqdata/logfile/dump.log -XX:+UseParNewGC -XX:MaxTenuringThreshold=1 -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.2.215 -Dorg.apache.activemq.UseDedicatedTaskRunner=true -Djava.util.logging.config.file=logging.properties -Dcom.sun.management.jmxremote -Dactivemq.classpath=/opt/work/activemq/conf; -Dactivemq.home=/opt/work/activemq -Dactivemq.base=/opt/work/activemq -jar /opt/work/activemq/bin/run.jar start[/color]


单机模式下测试流程:
只对queue进行测试,

1、broker和producer、consumer 都是分离开得 ,一台服务器专门做broker的主机服务器。
2、使用activemq在example下提供的例子在另一台服务器(8核,16G)进行消息生产
3、1个producer 没有consumer 的情况下,消息大小:1K,非持久化消息,每秒大概在2500左右,1000W以后大概每秒1500/s左右

4、1个peoducer 没有consumer,消息大小:1K,持久化消息(kaha),每秒 1200-1500左右,内存到1G左右时,缩减到800-1000左右/s

5、1个producer,1个consumer,消息大小:1K,持久化消息(kaha),每秒1200左右,持续稳定在这个状况

6、5个producer,5个consumer,消息大小:1K,持久化消息(kaha)、每秒在1000左右/s 持续

7、p:1,c:1, 消息大小:1024K,持久化消息,每秒在700-900/s

8、p:5,c:5,消息大小:1024,持久化消息,每秒大概在700左右/s

[size=small;]二、:Pure Master-Slave 模式[/size]

配置:
硬件配置:主从都一样,8 CPU,16G内存


Master 配置与单机模式一样
Slave 只是在<broker> 中增加了masterConnectorURI="tcp://192.168.2.215:61616" shutdownOnMasterFailure="false"

ActiveMQ 内存分配为2G

只对queue进行测试,

1、1个producer 没有consumer 的情况下,消息大小:1K,持久化消息,每秒大概在1000左右,内存过半(1G)时,大概在500-700左右
2、1个producer,1个consumer,消息大小:1K,持久化消息(kaha),每秒800-1000左右,持续稳定在这个状况
3、5个producer,5个consumer,消息大小:1K,持久化消息(kaha)、每秒在500-800左右/s 持续
4、p:1,c:1, 消息大小:1024K,持久化消息,每秒在700左右/s
5、p:5,c:5,消息大小:1024,持久化消息,每秒大概在500左右/s


这是我现在的测试结果.

但是这个结果让我不是很满意,想问问大家在配置ActiveMQ 的时候 我是否有配置有耗时的地方,还可以在那些方面进行优化。

公司的方案倾向于Pure Master-Slave模式但是这种模式有 双向存储的性能消耗,也想问问大家在应用方面那种模式更好一些,初步预算在生产环境为两个服务器。
希望大家能帮忙解决下问题 ,谢谢啊



   发表时间:2011-11-25  

以下 是 几个监控主机的图片截图

  • 大小: 261.2 KB
  • 大小: 246 KB
  • 大小: 244.6 KB
  • 大小: 243.4 KB
  • 大小: 240.3 KB
  • 大小: 163.4 KB
  • 大小: 169.8 KB
0 请登录后投票
   发表时间:2011-11-28  
肿么 没有 回答呢?

急啊~~~
0 请登录后投票
   发表时间:2011-11-28  
可以考虑下hornetq吧,hornetq的性能,我们的对比测试显示比activemq好很多。
0 请登录后投票
   发表时间:2011-11-28  
有没有用连接池
0 请登录后投票
   发表时间:2011-11-29  
我用默认配置发topic消息能达到2000/m,你可能是代码问题或测试方式有问题
0 请登录后投票
   发表时间:2011-11-29  
jacky_soft 写道
我用默认配置发topic消息能达到2000/m,你可能是代码问题或测试方式有问题



如果用多线程+for循环+非持久化消息   顶峰的时候达到3w/m以上
0 请登录后投票
   发表时间:2011-11-29  
hornetq比amq性能要好,而且amq消息堆积超过100w性能则很差,楼主可以测试一下这个场景
0 请登录后投票
   发表时间:2011-11-29  
dennis_zane 写道
可以考虑下hornetq吧,hornetq的性能,我们的对比测试显示比activemq好很多。


有空我去看一看,不过现阶段不好直接推翻现在amq的方案,谢谢啊
0 请登录后投票
   发表时间:2011-11-29  
java_user 写道
有没有用连接池


我在服务器上面,直接使用的是amq 提供的example 中的ProducerTool和ConsumerTool ,来测试的!!!!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics