On Wed, Jun 05, 2013 at 08:57:01AM -0700, Christian Posta wrote:

Hi,

further on this:

> Sounds like it's happening exactly as you have it configured.. I assume
> you're using non-persistent messages?
> 
> As Johan pointed out, your config kinda doesn't make sense :)
> 
> The <memoryUsage> is an overall broker limit. That is, if you set your
> <memoryUsage limit="40mb"> then you want to keep the aggregate of all of
> your destinations <= 40mb. Therefore, if you have 40 queues, set each one
> to 1mb. Or some other combo that is <= 40mb. In your case you set each
> queue to 50mb (<policyEntry memoryLimit="50mb"...) which doesn't work well.
> As for your questions...
> 
> 1) the 50mb limit doesn't kick in (you don't get PFC) because the broker
> has hit the 70% limit and is spooling your messages to disk. in the first
> case, it never hits the 70% mem limit of your destination because it filled
> up (40mb) the broker main memory first

Agreed, but if I have a config more like scenario 2.

> 2) it sure is happening :) check the logs for scenario #2... you hit the
> limit on the temp store

Sure as I understand then, the 70% kicks in and passes it over to the temp
storage, until this fills?

This is the config I'm testing:

       <policyEntry queue=">" memoryLimit="50mb" producerFlowControl="false">
           <pendingQueuePolicy>
               <fileQueueCursor />
           </pendingQueuePolicy>
       </policyEntry>
       <policyEntry topic=">" memoryLimit="50mb" producerFlowControl="false">

        <systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="300 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="1 gb" />
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="800 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

and the logs I'm seeing are:

[2013-06-06 15:37:23,283] INFO BrokerService.worker.1 
org.apache.activemq.store.kahadb.plist.PListStore - 
PListStore:[/var/lib/activemq/we7/data/localhost/tmp_storage ] initialized 
2013-06-06 15:37:23,283 [ervice.worker.1] INFO  PListStore - 
PListStore:[/var/lib/activemq/we7/data/localhost/tmp_storage ] initialized 
[2013-06-06 15:37:33,997] INFO ActiveMQ Transport: tcp:///10.0.9.124:46903 
org.apache.activemq.broker.region.Queue - 
Usage(default:temp:queue://testqueue:temp) percentUsage=99%, usage=839122944, 
limit=838860800, percentUsageMinDelta=1%;Parent:Usage(default:temp) 
percentUsage=100%, usage=839122944, limit=838860800, percentUsageMinDelta=1%: 
Temp Store is Full (99% of 838860800). Stopping producer 
(ID:meme-52453-1370529255477-2:1:-1:1) to prevent flooding queue://testqueue. 
See http://activemq.apache.org/producer-flow-control.html for more info 
(blocking for: 1s) 
2013-06-06 15:37:33,997 [0.0.9.124:46903] INFO  Queue - 
Usage(default:temp:queue://testqueue:temp) percentUsage=99%, usage=839122944, 
limit=838860800, percentUsageMinDelta=1%;Parent:Usage(default:temp) 
percentUsage=100%, usage=839122944, limit=838860800, percentUsageMinDelta=1%: 
Temp Store is Full (99% of 838860800). Stopping producer 
(ID:meme-52453-1370529255477-2:1:-1:1) to prevent flooding queue://testqueue. 
See http://activemq.apache.org/producer-flow-control.html for more info 
(blocking for: 1s) 


So, here, having now flow control, the messages are stored into the temporary
Area, until it fills up. But if I change the setting to have 
producerFlowControl,
then the behaviour is exactly the same:

[2013-06-06 15:56:32,576] INFO BrokerService.worker.1 
org.apache.activemq.store.kahadb.plist.PListStore - 
PListStore:[/var/lib/activemq/we7/data/localhost/tmp_storage ] initialized 
2013-06-06 15:56:32,576 [ervice.worker.1] INFO  PListStore - 
PListStore:[/var/lib/activemq/we7/data/localhost/tmp_storage ] initialized 
[2013-06-06 15:56:43,426] INFO ActiveMQ Transport: tcp:///10.0.9.124:47262 
org.apache.activemq.broker.region.Queue - 
Usage(default:temp:queue://testqueue:temp) percentUsage=99%, usage=839122944, 
limit=838860800, percentUsageMinDelta=1%;Parent:Usage(default:temp) 
percentUsage=100%, usage=839122944, limit=838860800, percentUsageMinDelta=1%: 
Temp Store is Full (99% of 838860800). Stopping producer 
(ID:meme-59314-1370530472794-2:1:-1:1) to prevent flooding queue://testqueue. 
See http://activemq.apache.org/producer-flow-control.html for more info 
(blocking for: 1s) 
2013-06-06 15:56:43,426 [0.0.9.124:47262] INFO  Queue - 
Usage(default:temp:queue://testqueue:temp) percentUsage=99%, usage=839122944, 
limit=838860800, percentUsageMinDelta=1%;Parent:Usage(default:temp) 
percentUsage=100%, usage=839122944, limit=838860800, percentUsageMinDelta=1%: 
Temp Store is Full (99% of 838860800). Stopping producer 
(ID:meme-59314-1370530472794-2:1:-1:1) to prevent flooding queue://testqueue. 
See http://activemq.apache.org/producer-flow-control.html for more info 
(blocking for: 1s) 

So, 

1) how these two different configurations differ, if I'm seeing the same
behaviour? Shouldn't it have stopped based on the memory limit of each 
of the queue?

2) I'm assuming that this is the right behaviour for activeMQ? I mean,
assuming I have sensible memory limits and temp storage, this is how it's
supposed to behave?

3) Regardless, I should be informing the consumers that the temp storage is
full rather than making them hang? This setting (sendFailIfNoSpace) seems not
to make any difference whether producer flow control is enabled or not.

4) What's the relationship between memoryUage (global config option) and the
java heap space defined by -Xms512M in the config?

Again, if you could shed some light and help me undrstand this, it'd be
hightly appreciated. Thanks.

Regards.
-- 
JRF

Reply via email to