Digging into MSMQ
I got into a discussion online about MSMQ and its performance. So I decided to test things out.
What I want to do is to check a few things, in particular, how much messages can I push to and from MSMQ in various configurations.
I created a non transactional queue, and then I run the following code:
var sp = Stopwatch.StartNew();
int count = 0;
while (sp.Elapsed.TotalSeconds < 10)
var message = new Message
BodyStream = new MemoryStream(data)
This gives me 181,832 messages in 10 seconds ,or 18,183 messages per second. I tried doing the same in a multi threaded fashion, with 8 threads writing to MSMQ, and got an insufficient resources error, so we’ll do this all in a single threaded tests.
Next, the exact same code, but for the Send line, which now looks like this:
This gives me 43,967 messages in 10 seconds, or 4,396 messages per second.
Next I added DTC, which gave me a total of 8,700 messages in ten seconds, or 870 messages per second! Yeah, DTC is evil.
Now, how about reading from it? I used the following code for that:
Message receive = queue.Receive(TimeSpan.Zero);
receive.BodyStream.Read(data, 0, data.Length);
catch (MessageQueueException e)
Reading from transactional queue, we get 5,955 messages per second for 100,000 messages. And using non transaction queue it can read about 16,000 messages a second.
Note that those are pretty piss poor “benchmarks”, they are intended more to give you a feel for the numbers than anything else. I’ve mostly used MSMQ within the context of DTC, and it really hit the performance hard.