Почему производительность MSMQ падает (примерно на треть), когда я использую 10 очередей вместо 1?
Короче говоря, производительность MSMQ резко падает, когда я использую более 1 очереди в многопоточном приложении (получение из каждой очереди в другом потоке).
Это похоже на то, что классы MSMQ в .NET имеют общий ресурс, который сокращается при увеличении числа очередей. Кстати, я использую Windows 7 для этих тестов с Visual Studio 2010.
Примечание. У меня была 1 очередь для связи между двумя приложениями. Мне нужно использовать только восстанавливаемый режим. Он работал нормально, пока не достиг стены со скоростью 100-150 сообщений в секунду. Затем я подумал, что могу увеличить вычислительную мощность, увеличив количество очередей до 10 и обрабатывая их параллельно. Но когда я это сделал, время приема увеличилось почти в 3 раза! :О
Я писал свои приложения на 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;
}
}
}
}
Task
(SingleQueueReceiver
)? - person Kiquenet   schedule 11.03.2015