Might the choke point be the NIC on the EC2 instance? If you run the consumers for A and B on different EC2s, how does that throughput compare to what you're seeing?
Also, I'd recommend you use JVisualVM or similar to capture a CPU sampling (not profiling!) snapshot of your producer program to see where it's spending its time. If there's a significant amount of time spent anywhere except making the network call to send the bytes of the payload, then dig into that. Tim On Wed, Aug 28, 2019, 12:03 PM alan protasio <alanp...@gmail.com> wrote: > Hi, > > I think you can try disable concurrentStoreAndDispatchQueues and rerun the > tests. > > Alan Diego > > > On Wed, Aug 28, 2019 at 9:42 AM James Green <james.mk.gr...@gmail.com> > wrote: > > > Hi, > > > > Following-up as I've run more tests. > > > > My minimal producer suffered the same bug as our main application: we had > > spring boot activemq thread pooling turned on as a property, but the > > library (referenced in the main docs) was not included. Looking back at > my > > rather sparse notes at the time I activated this my sends of 10K messages > > went from taking 11m47s to between 2m56s - 3m31s which is a marked > > improvement. > > > > To my chagrin, this has made little different to our real-world > > application, and so I have modified my minimal producer to be capable of > > sending to the main application via it's queues. > > > > Allow me to elaborate at this point as it's important to understand what > > I'm looking at... > > > > The messages follow a small path through a series of queues as they are > > processed. Queue A -> B -> C. > > > > If my minimal producer sends to Queue C (skipping A and B) I'm able to > > produce at 49/s which is "quick enough". > > If my minimal producer sends to Queue B (skipping A) I'm able to produce > at > > 28/s - 38/s which is variable but most of the tests reached 38/s. > > If my minimal producer sends to Queue A I'm able to produce at 28/s - > 42/s > > - again variable. > > > > Now Queues A and B are consumed by separate Camel routes inside the same > > application. Queue C is entirely separate. > > > > Looking at throughput graphs of the consumption of Queue C, when first > > going through (A,B) for 10K messages, then going through (B), I can see > > (A,B) is twice as slow. > > > > I'm left wondering if there's contention somehow within the application > > consuming from (A,B) that is only showing up during load testing on AWS, > I > > was not expecting it would be 2x slower unless the producer thread is > > shared - you might imagine a thread pool was solve that! > > > > At this point I have ensured that there are 4 instances of each > application > > and they can happily deal with about 50 messages per second across the > > queues with persistence on. I am uncertain whether I should be expecting > > more. > > > > If anyone has insights on why the two routes within the same application > > appear contended and indeed on whether overall throughput should be a lot > > higher I'd love to hear it. > > > > James > > > > > > On Thu, 22 Aug 2019 at 14:02, Tim Bain <tb...@alumni.duke.edu> wrote: > > > > > Can you create a minimal producer via the OpenWire protocol in Java or > > > another language of your choice, to determine if your Camel producer is > > > slow because it's OpenWire or because it's Camel? I suspect you'll find > > > that OpenWire is the culprit, not Camel, but let's confirm that. > > > > > > All of these numbers sound tiny compared to what the ActiveMQ product > is > > > capable of (though I don't have any insight into how Amazon has > > configured > > > the brokers, nor into any code customizations they might have made). If > > you > > > run multiple minimal producers in parallel, does throughput increase > > > linearly? > > > > > > Also, you say you're testing with small payloads; are they small enough > > > that you might be running into the Nagle algorithm on your TCP sockets? > > If > > > you use larger (e.g. 1KB) payloads, what does that do to your > throughput > > on > > > a single producer? > > > > > > Tim > > > > > > On Thu, Aug 22, 2019, 2:54 AM James Green <james.mk.gr...@gmail.com> > > > wrote: > > > > > > > Hi all, > > > > > > > > I've been busy shifting an existing workload into AWS recently, and a > > > load > > > > test shows a serious performance drop when sending to ActiveMQ which > I > > > > could use some advice on. > > > > > > > > Quick architecture summary: We send requests via a webserver that are > > > > forwarded as messages to a queue. A backend receives these messages > and > > > > forwards them onward to another queue. Spring Boot with Camel powers > > the > > > > show within Docker containers. Messages are persistent. > > > > > > > > Story so far: > > > > > > > > Tests show this first queue builds rapidly with pending messages yet > > > > monitoring of our existing production environment shows no such > > backlog. > > > > > > > > Our existing production environment has everything in a single DC so > > it's > > > > super low latency. Our AWS environment uses Fargate with AmazonMQ. I > > > > understand send latency will be higher and AmazonMQ will store the > > > messages > > > > across three AZs. > > > > > > > > So I launched a small EC2 instance to run some comparison tests: > > > > > > > > Receiving via a Camel route is super quick. This is not a problem. > > > > Sending via a minimal Camel route is super slow. 14 messages per > > second. > > > We > > > > appear to be doing at least 20-30 per second in production but it's > > > enough > > > > of a difference. > > > > Sending via PHP with stomp-php setting both persistence on and > receipt > > > > headers on is substantially faster than sending via Camel. 55 > messages > > > per > > > > second. > > > > Tests have been with 10K small payloads. > > > > > > > > At this point I'm thinking that both Camel and PHP should be sending > > with > > > > the same properties - synchronously and with persistence. The > messages > > on > > > > the queue are flagged persistent when viewed by the web console. > > > > > > > > Can anyone provide further suggestions to try? > > > > > > > > Thanks, > > > > > > > > James > > > > > > > > > >