<div dir="ltr">By default, the RabbitTemplate.*sendAndReceive() operations create a temporary reply queue for each request. This is not particularly efficient for high volume situations.<div><br></div><div>Consider using a fixed reply queue in these situations.</div>
<div><br></div><div><a href="http://docs.spring.io/spring-amqp/reference/html/amqp.html#request-reply">http://docs.spring.io/spring-amqp/reference/html/amqp.html#request-reply</a><br></div></div><div class="gmail_extra"><br>
<br><div class="gmail_quote">On Sun, Sep 29, 2013 at 4:24 PM, tgv amni <span dir="ltr">&lt;<a href="mailto:tgvt53@gmail.com" target="_blank">tgvt53@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri">We are new to rabbitMQ. We use rabbitmq 3.1.5 in our test environment. This is installed on a red hat linux server (6.4), the same server where our application is also running. The database (postgresql) is on a separate server. </font></font></p>


<div style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri">We are using rabbitMQ default configuration. </font></font></div>
<div style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri">I ran a test where concurrent users post to a rest service (say R). This service basically expects <span> </span>two UUIDs (UUID_A and UUID_B), that identify two database entities <span> </span>A and B. Once the service is called with these two values, it publishes to the default exchange. </font></font></div>


<div style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri">There are two durable queues bound to this exchange. QueueA and QueueB. Two services,<span>  </span>Service A and Service B, each listen on QueueA and QueueB respectively.<span>  </span>There are no other consumers to these queues. Service A picks up the message and validates<span>  </span>UUID_A exists in the database. Service B validates UUID_B exists. If they are both valid, an entry is made to the db, mapping these two values. So each valid post results in an entry in a table in the db.</font></font></div>


<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri">I find as the test progresses, response <span> </span>time of this post increases.<span>  </span>A lot of the time is being spent in<span>  </span>Unsafe.park (boolean,long)<span>  </span>in sun.misc package. </font></font></p>


<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri">Here is the call stack that shows classes where this Unsafe.park() is being involved from. It appears to be called from spring framework’s RabbitTemplate class.</font></font></p>


<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri">Unsafe.park</font></font></p>
<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri"><span> </span>LockSupportparkNanos(Object,Long)</font></font></p>
<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri"><span>  <strong> </strong></span><strong>AbstractQueuedSynchronizer$ConditionObject.awaitNanos(long)</strong></font></font></p>
<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri"><span>     </span>ArrayBlockingQueue.poll(long, TimeUnit)</font></font></p>
<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri"><span>        </span>RabbitTemplate$3.doInRabbit(Channel)</font></font></p>
<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri"><span>           </span>RabbitTemplate$3.doInRabbit(Channel)</font></font></p>
<p style="MARGIN:0in 0in 0pt 0.5in"><font size="3"><font face="Calibri">RabbitTemplate.execute(ChannelCallback)</font></font></p>
<p style="MARGIN:0in 0in 0pt 0.5in"><font size="3"><font face="Calibri"><span>  <strong> </strong></span><strong>RabbitTemplate.doSendAndReceiveWithTemporary(String,String,Message)</strong></font></font></p>

<p style="MARGIN:0in 0in 0pt 0.5in"><font size="3"><font face="Calibri"><span>      </span>RabbitTemplate.doSendAndReceive(String,String,Message)</font></font></p>
<p style="MARGIN:0in 0in 10pt 0.5in"><font size="3"><font face="Calibri"><span>         </span>RabbitTemplate.convertSendAndReceive(String,String,Object, MessagePostProcessor)</font></font></p>

<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri"><span>                            </span>RabbitTemplate.convertSendAndReceive(String,Object)</font></font></p>
<p style="TEXT-INDENT:0.25in;MARGIN:0in 0in 10pt 0.75in" class="MsoNormal"><font size="3"><font face="Calibri">…</font></font></p>
<p style="TEXT-INDENT:0.5in;MARGIN:0in 0in 10pt 0.25in" class="MsoNormal"><font size="3"><font face="Calibri"><span>           </span>…</font></font></p>
<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><span></span></p>
<div style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri">As the test progresses where the load increases from 50 users to 200 users over a period of 20 mins, this response time increases from 50 ms to almost 2 seconds. 99% of the response time is spent in Unsafe.park (waiting).  At the end of 20 mins, roughly 100,000 entries are made into the db.That is roughly 83 Posts (i.e messages) per second. Each message contains a couple of UUIDs and a couple of dates. There is no other activity on this server.</font></font></div>


<div style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri"></font></font><font size="3"><font face="Calibri">Why is there so mcuh time being spent in Unsafe.park() ? It looks like there is a wait for some resource lock. How can we reduce this wait ?  Overall CPU is about 40-45% on this box (a 12 core server). 2/3rds of this time is being spent in the rabbitMQ server.</font></font></div>


<div style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri">Is there a plug-in to monitor cpu usage on the server? How can we determine where time is being spent within the broker ?</font></font></div>


<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri">Thanks,</font></font></p>
<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3"><font face="Calibri">tgv</font></font></p>
<p style="MARGIN:0in 0in 10pt" class="MsoNormal"><font size="3" face="Calibri"> </font></p>
<br>_______________________________________________<br>
rabbitmq-discuss mailing list<br>
<a href="mailto:rabbitmq-discuss@lists.rabbitmq.com">rabbitmq-discuss@lists.rabbitmq.com</a><br>
<a href="https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss" target="_blank">https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss</a><br>
<br></blockquote></div><br></div>