[rabbitmq-discuss] Performance degrades with increasing queue depth
Chris Duncan
celldee at gmail.com
Tue Sep 8 00:36:20 BST 2009
Hi Aisha,
Hope you don't mind me butting in here.
2009/9/7 Aisha Fenton <aisha.fenton at gmail.com>
> Hi Chunk.
> I don't know Suhail. And his problem may be different from mine.
>
> To isolate the problem, I've reduce what I'm doing down to the attached
> code files. One pushes messages, the other pops them.
>
> I see the problem even when only test_push.rb is running (as long as the
> queue is sufficiently pre-populated). Nothing else is using rabbitmq when
> I'm doing the test.
>
> I'm getting the same problem on several different machines here -- my local
> MacOSX box and a server class Debian box.
>
>
> exchange - durable or not?
>
> not durable
>
> exchange - type? (Looks like "fanout" from the original post)
>
> fanout
>
> number of bindings per exchange
>
> 1
>
> queue - durable?
>
> not durable
>
> publishing settings - require ack? persistent? immediate?
>
> no ack, non persistent, and non immediate.
>
> message size? 1K according to the original post
>
> < 1K
>
>
>
> *test_push.rb *
> *---*
>
> *require "rubygems"*
> *require "bunny"*
> *
> *
> *EXCHANGE = "raw_telemetry"*
> *QUEUE = "process_telemetry"*
> *
> *
> *count ||= 0*
> *prev_time ||= Time.now*
> *msg_server = Bunny.new(:spec => '08')*
> *msg_server.start*
> *
> *
> *msg_server.exchange(EXCHANGE, :type => :fanout)*
> *msg_server.queue(QUEUE).bind(EXCHANGE)*
> *
> *
> *loop do*
> *
> *
> * msg_server.exchange(EXCHANGE).publish("This is my msg")*
> * *
> * count += 1*
> * if count > 100*
> * t = Time.now*
> * puts("msgs pushes per sec: #{count / (t - prev_time)}")*
> * prev_time = t*
> * count = 0*
> * end*
> * *
> *end*
> *
> *
> * test_pop.rb
> ---
>
> *
> * require "rubygems"
> require "bunny"
>
> @msg_server = Bunny.new(:spec => '08')
> @msg_server.start
>
> def start
> count ||= 0
> prev_time ||= Time.now
> queue = @msg_server.queue("process_telemetry")
>
> loop do
> result = queue.pop
> next if result == :queue_empty
>
> count += 1
> if count > 100
> t = Time.now
> puts("msgs pops per sec: #{count / (t - prev_time)}")
> prev_time = t
> count = 0
> end
> end
>
> end
>
> begin
> start()
> ensure
> puts "stopping"
> @msg_server.stop
> end
> *
>
I have some observations -
1. In your test_push.rb you have the line -
*msg_server.exchange(EXCHANGE).publish("This is my msg")*
**
The exchange method declares an exchange, so you are doing this every time
you publish a message which will slow things down. Declare the exchange
using a variable outside the loop like this -
*my_exchange = msg_server.exchange(EXCHANGE, :type => :fanout)*
**
Then use the variable inside the loop -
**
*my_exchange.publish("This is my msg")*
**
I think Paolo has highlighted the same thing.
2. In your test_pop.rb you don't need to specify *:spec => '08'.* Bunny.new
defaults to the AMQP 0-8 spec version.
Also, do you mean to have -
*next if result == :queue_empty*
**
How are you breaking out of the loop? Might you want to use 'break' instead
of 'next'?
3. A Bunny instance only ever uses 2 channels unless you explicitly create
more. Since you don't seem to be creating more channels I don't think that's
where your issue lies.
--
Regards
Chris
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/attachments/20090908/ec5effd0/attachment.htm
More information about the rabbitmq-discuss
mailing list