1 つのキューではなく 10 のキューを使用すると、MSMQ のパフォーマンスが低下する (~3 分の 1) のはなぜですか?
つまり、マルチスレッド アプリケーションで複数のキューを使用すると (別のスレッドで各キューから受信する)、MSMQ のパフォーマンスが大幅に低下します。
.NET の MSMQ クラスには、キューの数が増えると縮小する共有リソースがあるようなものです。ところで、これらのテストには Visual Studio 2010 で Windows 7 を使用しています。
注: 2 つのアプリケーション間で通信するためのキューが 1 つあります。回復可能モードのみを使用する必要があります。100-150 メッセージ/秒の壁にぶつかるまでは正常に動作していました。そこで、キューを10個に増やして並列処理することで処理能力を上げられるのではないかと考えました。しかし、私がやったとき、受信時間はほぼ3倍になりました!:O
C# を使用してアプリケーションを作成しました。リーダー スレッドを次のように初期化します。
for (int i = 101; i <= 110; i++)
{
var t = new Task<Tuple<TimeSpan, int, int, int>>(SingleQueueReceiver, i, TaskCreationOptions.LongRunning);
tasks.Add(t);
}
foreach (var t in tasks) t.Start();
そして、私のキュー名は、すでに作成した buffer101 から buffer110 です。それらはトランザクションではありません。私の受信者タスク関数 (スレッド) は次のとおりです。
static Tuple<TimeSpan, int, int, int> SingleQueueReceiver(object o)
{
var qID = (int)o;
TimeSpan SingleQueueReceiver_Elapsed = TimeSpan.FromMilliseconds(0);
int SingleQueueReceiver_Count = 0;
var watch = new Stopwatch();
watch.Start();
using (var q = new MessageQueue(string.Format(@".\private$\buffer{0}", qID), QueueAccessMode.Receive))
{
q.UseJournalQueue = false;
var @continue = true;
var sleep = TimeSpan.FromMilliseconds(1);
while (true)
{
if (!@continue)
{
watch.Stop();
SingleQueueReceiver_Elapsed = watch.Elapsed.Subtract(sleep);
return Tuple.Create(SingleQueueReceiver_Elapsed, SingleQueueReceiver_Count, qID, 2);
}
try
{
var m = q.Receive(sleep);
SingleQueueReceiver_Count++;
}
catch (MessageQueueException mqe)
{
if (mqe.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout) @continue = false;
}
}
}
}