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

标签 c# windows msmq message-queue administration

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

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

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

注意:我有 1 个队列用于在 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 个单线程监听器?

如果您发布您的代码,那么我们很有希望看到发生了什么。

关于c# - MSMQ 中的多个队列(性能下降),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13658633/

相关文章:

c# - 为什么我的 C# "hello world"COM 客户端和服务器会抛出强制转换异常?

c# - CS 脚本 - 如何像标准 Windows 可执行文件一样运行 '.cs' 文件?

c# - 如何直接在 .NET 代码中快速创建虚拟图像

c# - 从其他进程读取和写入

C 中无法打印最大行

wcf - 如何在WCF中使用MSMQ?

c# - 最佳方法建议 : C# based Windows service implementation

c# - 从字符串中去除前导 n 个字母字符

linux - 带有 Bash Windows 的 Google Drive 文件夹

msmq - 将邮件从死信队列移至传出队列MSMQ