Artur Ispiriants
Artur Ispiriants

Reputation: 108

Remote MSMQ connection performance

We experience a lack of performance during iteration across remote private MSMQ queue. We tried to use both API methods - MessageQueue.GetAllMessages() and MessageQueue.GetEnumerator2() and see the same results.

It seems that the problem is in Message Queuing Service, because it always uses only up to 15% of CPU (single core). For example, if we iterate across local queue - we use 100% of CPU and can load 1 million messages in 2 seconds, but for remote queues it takes 30 seconds to load only 10K! Network connection is 100MBPs.

Is there a way to increase MSMQ performance for remote queues and force it to use 100% of CPU or Network?

Upvotes: 2

Views: 1036

Answers (3)

John Breakwell
John Breakwell

Reputation: 4687

MSMQ is optimised to go as fast as it can - it's not going slow just to irritate you.

Performance will be poor on remote queues. This is not the best way to use MSMQ. High performance is obtained through the "send remote, read local" model.

Remote access uses RPC which will be slow over a LAN. If you looked at a network trace, you would see all the back-and-forth communication. Binding to the remote RPC service and querying to find where MSMQ is listening; binding to the remote MSMQ RPC listener; requesting messages from the listener; etc etc.

Upvotes: 4

Sql Surfer
Sql Surfer

Reputation: 1422

Try using the TCP connection syntax and use an explicit numerical IP address 123.123.123.123. See if this affects your performance. If it does then think security.

You use the terms GetMessage but also talk about loading so I am confused about if you want performance on Message Receive “GetOne” or Load into the queue operations.

For core production code I always operate one at a time on the messages so I am never trying to GetAllMessages or EnumerateAllMessages except in specific management functions.

Upvotes: 0

Scott Hannen
Scott Hannen

Reputation: 29222

This may or may not be relevant in your scenario, but it's a way to improve overall performance for MSMQ.

If you're sending messages that wrap a consistent type - a serialized class, for example - buffer them before sending and send one message containing an array or collection of items.

I was working with some serialized class and sending a large volume of messages. I tested and found that if I sent them in batches of 50 instead of individually then the size of queue was reduced by 75%. I didn't spend much time optimizing from there. It depends on the size of your messages. But this gets rid of much of the overhead incurred in sending individual messages.

Upvotes: 0

Related Questions