繁体   English   中英

MSMQ中的多个队列(性能下降)

[英]Multiple Queues in MSMQ (Performance Drops)

当我使用10个队列而不是1个队列时,为什么MSMQ的性能下降(〜三分之一)?

简而言之,当我在多线程应用程序中使用多于1个队列(从不同线程中的每个队列接收)时,MSMQ性能会急剧下降。

这就像.NET中的MSMQ类有一个共享资源,当队列数量增加时会缩小。 顺便说一下,我使用Windows 7进行Visual Studio 2010的这些测试。

注意:我有2个队列用于在2个应用程序之间进行通信 我需要使用只有可恢复的模式。 它工作正常,直到达到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;
            }
        }
    }
}

我认为,与多个msmq队列相比,性能下降更可能是由于上下文切换或其他多线程副作用。

您是否尝试过扩展到10个队列和10个单线程侦听器?

如果你发布你的代码,那么我们可以看到有希望发生的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM