2016年3月22日星期二

ActiveMQ_022:内存设置

环境:OS X EI Capitan 10.11.4 + ActiveMQ 5.13

1. ActiveMQ JVM 内存设置
修改 bin/activemq 脚本,在开头增加
# Set jvm memory configuration
if [ -z "$ACTIVEMQ_OPTS_MEMORY" ] ; then
    ACTIVEMQ_OPTS_MEMORY="-Xms8G -Xmx8G"
fi

如果 Broker 中有大量线程,可以考虑设置 -Xss: 减少每个线程使用的 stack size。

2. Broker 使用内存设置:memoryUsage
<systemUsage>
   <systemUsage>
       <memoryUsage>
           <memoryUsage percentOfJvmHeap="70" />
       </memoryUsage>
       <storeUsage>
           <storeUsage limit="100 gb"/>
       </storeUsage>
       <tempUsage>
           <tempUsage limit="50 gb"/>
       </tempUsage>
   </systemUsage>
</systemUsage>
说明:
(1)memoryUsage 表示 Broker 可以使用的最大内存,是所有队列可以使用内存的总和。
当超过 memoryUsage 指定的大小时,消息生产者会被阻塞。
(2)storeUsage 表示持久化存储文件的大小。
(3)tempUsage 表示非持久化消息存储的临时内存大小。

3. 设置某个 destination 可以使用的内存
<destinationPolicy>
    <policyMap>
        <policyEntries>
            <policyEntry queue=">" memoryLimit="5MB"/>
        </policyEntries>
    </policyMap>
</destinationPolicy>

4. 消费者的内存
消费端的内存爆掉通常是由于 prefetch size 太大造成的。
(1)修改所有消费者的 prefetch size
tcp://localhost:61616?jms.prefetchPolicy.all=50
(2)修改所有 Queue 的消费者的 prefetch size
tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1
(3)修改指定 Queue 的消费者的 prefetch size
queue = new ActiveMQQueue("TEST.QUEUE?consumer.prefetchSize=10");
consumer = session.createConsumer(queue);

参考文献:
1. http://activemq.apache.org/javalangoutofmemory.html
2. http://www.huaishao8.com/config/activemq/198.html
3. http://activemq.apache.org/what-is-the-prefetch-limit-for.html

没有评论: