Give me one more piece of information. What is the prefetch settings you're using for your topics (durable and non-durable subscribers), and how many durable subscribers are connected?
On Sun, Jul 28, 2013 at 8:40 PM, Jake Choi <j...@yahoo-inc.com> wrote: > Thanks a lot Christian for the well-explained documentation and this > explains > why I'm seeing the trouble with topic durable subscriptions regarding the > per-destination memory usage & limit. > > First, let me quote some from your writing: > > "Main Broker Memory, Destination Memory, Subscription Memory > > ... > > A destination, when it’s created, will create its own SystemUsage object > (which creates its own separate Memory, Store, and Temp Usage objects) but > it will set its parent to the be broker’s main SystemUsage object. A > destination can have its memory limits tuned individually (but not Store > and > Temp, those will still delegate to the parent). To set a destination’s > memory limit: > ... > > So the destination usage objects can be used to more finely control > MemoryUsage, but it will always coordinate with the Main memory for all > usage counts. This functionality can be used to limit the number of > messages > that a destination keeps around so that a single destination cannot starve > other destinations. *For queues, it also affects the store cursor’s high > water mark. A queue has different cursors for persistent and non-persistent > messages. If we hit the high water mark (a threshold of the destination’s > memory limit), no more messages be cached ready to be dispatched, and > non-persistent messages can be purged to temp disk as necessary (if the > StoreCursor will use FilePendingMessageCursor… otherwise it will just use a > VMPendingMessageCursor and won’t purge to temporary store).* > > If you don’t specify a memory limit for individual destinations, the > destination’s SystemUsage will delegate to the parent (Main SystemUsage) > for > all usage counts. This means it will effectively use the broker’s Main > SystemUsage for all memory-related counts. > > *Consumer subscriptions, on the other hand, don’t have any notion of their > own SystemUsage or MemoryUsage counters. They will always use the broker’s > Main SystemUsage objects.* The main thing to note about this is when using > a > FilePendingMessageCursor for subscriptions (for example, for a Topic > subscription), the messages will not be swapped to disk until the cursor > high-water mark (70% by default) is reached.. but that means 70% of Main > memory will need to be reached. That could be a while, and a lot of > messages > could be kept in memory. And if your subscription is the one holding most > of > those messages, swapping to disk could take a while. As topics dispatch > messages to one subscription at a time, if one subscription grinds to a > halt > because it’s swapping its messages to disk, the rest of the subscription > ready to receive the message will also feel the slow down..." > > What I don't understand from the above is why consumer subscriptions (and > their cursors) of topics are not using per-destination MemoryLimit but > share > the Broker's main MemoryLimit, unlike the queues (please see the bolded > sentences above). Due to this + some logics inside AbstractStoreCursor's > space checking logics, PFC always kicks in for the topic whenever the > persistent store cursor's cache (pendingList) gets full. Let me explain > what's happening: > > 1. A topic is created, with per-destination memory limit = 1MB and broker's > main memory limit = 5MB. > 2. Topic's SystemUsage (for PFC purpose) is configured with per-destination > memory limit (1MB), while TopicStorePrefetch(persistent store cursor)'s > SystemUsage (for remaining cache space checking purpose) is configured with > broker's main memory limit (10MB). > 3. The 1st message of 0.8MB is published: > a. PFC doesn't kick in at Topic layer, as Topic#memoryUsage#isFull is > true. > b. It's cached to the persistent cursor, as AbstractStoreCursor#hasSpace > is true. > c. per-dest memory usage % becomes 90%, while main memory usage % > becomes > 9%. > 4. The 2nd message of 0.8MB is published: > a. PFC doesn't kick in either, as per-dest memory usage is 90% (< 100%). > This is fine. > b. *(I expect here that this second message shouldn't be cached to the > cursor but invalidate it, but)this second message is also cached to the > persistent cursor, as AbstractStoreCursor#hasSpace is still true: 9% < 70% > (main memory usage high watermark)!!!* > c. per-dest memory usage % becomes 180%, while main memory usage % > becomes 18%. > 5. The 3rd message of 0.8MB is published: > a. *(I don't want this behavior but) PFC kicks in!!!* because > per-destination memory limit is exceeded (180%). > > The behavior I wanted to see is: at #4.b. TopicStorePrefetch checks cursor > memory availability against per-dest memory limit (not against broker's > main > memory limit) so that cursor pending cache gets disabled (just keeps what > has been cached) w/o increasing the per-destination memory usage. > > I don't want to block persistent message publishing to topics by the > per-destination memory limit but only for non-persistent message > publishing, > cause the store size allowed for a destination is relatively higher than > the > memory limit: e.g. I'd like to allow per-destination persistent message > publishing up to 10GB disk space without being blocked by the memory limit > & > PFC... How can I achieve this? > > > > -- > View this message in context: > http://activemq.2283324.n4.nabble.com/cursor-memory-usage-limit-vs-memory-usage-limit-tp4669679p4669819.html > Sent from the ActiveMQ - User mailing list archive at Nabble.com. > -- *Christian Posta* http://www.christianposta.com/blog twitter: @christianposta