[ 
https://issues.apache.org/activemq/browse/AMQ-2532?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=56432#action_56432
 ] 

Gary Tully commented on AMQ-2532:
---------------------------------

I suspect that this is resolved on trunk via 
https://issues.apache.org/activemq/browse/AMQ-2468 and 
https://issues.apache.org/activemq/browse/AMQ-2481

Can you validate with a 5.3.1-SNAPSHOT of 5.4-SNAPSHOT

> Broker paging all available messages from store leading to resource exhaustion
> ------------------------------------------------------------------------------
>
>                 Key: AMQ-2532
>                 URL: https://issues.apache.org/activemq/browse/AMQ-2532
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.3.0
>         Environment: Java 1.6
>            Reporter: Fabrice Delaporte
>
> There seems to be a regression (works fine in 5.2.0) related to the fix for 
> the following:
> https://issues.apache.org/activemq/browse/AMQ-2413
> I think the intent of the original code was to prevent uncontrolled paging of 
> pending messages. The doPageIn method is called in version 5.3.0 :
> - each time a message is acked/committed
> - each time the MemoryUsage is decreased
> As a result, if you create a queue with, say, 1 000 000 messages in it, then 
> start a consumer, the broker will try to page in all the messages from the 
> store as consuming goes on (with default configuration values, 200 paged in 
> messages for one consumed message minimum - I say minimum because if the 
> MemoryUsage is decreased when you consume a message, then doPageIn is invoked 
> again). Guaranteed OutOfMemoryError as in general consuming messages is 
> slower than paging from store. I guess the same can occur when you have a 
> fast producer and a slow consumer, without producer flow control.
> I would say that in any case, the broker should never page in more messages 
> than the maxPageSize attribute, plus the number of dispatched messages. More 
> formally:
> {code:java}
>             int toPageIn = getMaxPageSize() - pagedInPendingDispatch.size();
> {code}
> And just to make sure we never get a negative value:
> {code:java}
>             int toPageIn = Math.max(0, getMaxPageSize() - 
> pagedInPendingDispatch.size());
> {code}
> Note 1: this behavior is also exhibited by the background message expiration 
> logic, that forces message pagination each time it is run. With big queues 
> without consumers, by default you'll get 200 more messages paginated each 
> time the expiration task is run. Eventually leading to broker resource 
> exhaustion if no consumer comes into play in the near future with active 
> producers queuing up messages.
> Note 2: this may also be related to 
> https://issues.apache.org/activemq/browse/AMQ-2468
> Workarounds:
> - setting lazyDispatch to true fixes the problem for message consuming only
> - background expiration can be disabled by setting expireMessagesPeriod to -1
> Cheers,
> Fabrice

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to