2013-03-25 3 views
0

Можете ли вы объяснить, сколько оперативной памяти будет использоваться при использовании восстановимых сообщений? Я знаю, что одно сообщение потребляет приблизительно 70-80 байт, и это нормально, и я знаю, что тело сообщения будет сохранено на диске, но может ли оно также дублировать тело в ОЗУ? Я попытался протестировать это с помощью экспресс-и восстановимого сообщения (ограничение на хранение сообщений - 1gb) - и в обоих случаях, которые я вижу в обработчике процессов, этот процесс службы msmq достиг своего рабочего набора (памяти) до 1gb. Я понимаю, что в случае экспресс-сообщений это нормально, но с восстановимыми сообщениями это будет намного меньше!MSMQ с использованием вопросов

И второй вопрос касается ограничения обратного вызова MSMQ.

Если вы получаете сообщения с обратным вызовом, считайте, что каждый процесс может регистрироваться только до 63 обратных вызовов. Если ваши обратные вызовы ожидают очереди без каких-либо действий, вы можете достичь этого предела.

Это относится ко всем очередям или только к одному? Например, у меня есть процесс, и я делаю что-то вроде:

QueueFirst = new MessageQueue(@".\test") { Formatter = new BinaryMessageFormatter() }; 
QueueFirst.ReceiveCompleted += QueueOnReceiveCompleted; 
QueueSecond = new MessageQueue(@".\test") { Formatter = new BinaryMessageFormatter() }; 
QueueSecond.ReceiveCompleted += QueueOnReceiveCompleted; 
for (int i = 0; i < 63; i++) 
{ 
    QueueFirst.BeginReceive(TimeSpan.FromSeconds(10), "", Callback); 
    QueueSecond.BeginReceive(TimeSpan.FromSeconds(10), "", Callback); 
} 

Могу ли я это сделать? Я спрашиваю, потому что, если я устанавливаю верхний предел цикла на значение больше 63, ничего плохого не происходит. Я использую этот method overload, потому что в справке есть что-то о обратных вызовах, означает ли это, что использование обработчика событий не имеет ограничений?

+0

Почему вы смотрите на рабочий комплект? http://getgreenshot.org/2010/07/24/a-few-words-on-memory-usage-or-working-set-vs-private-working-set/ –

ответ

1

MSMQ сохраняет сообщения в памяти, если это возможно для производительности.
Сообщения также записываются на диск для всех типов - express/recoverable/transactional.
Размер сообщения не имеет значения для определения использования ОЗУ.
This blog должен иметь все необходимое, чтобы понять, как память используется сообщениями.
This blog также полезен.

+0

Спасибо, Джон, я был прочитал ваш блог (особенно в этих статьях), но у меня все еще есть вопросы - если у меня есть много сообщений msmq (они обрабатываются, конечно, но все равно нажимают быстрее, чем появляются), могут ли сообщения питаться всей моей оперативной памятью? Это будет здорово ограничить использование ОЗУ и установить большой предел диска. И вопрос о потоковом - относится ли это только к 63 асинхронным обработчикам для очереди или к 63 асинхронным обработчикам для всех локальных очередей? Поскольку речь идет о обратном вызове, возможно, это произошло только для конструктора с AsyncCallback, а не для события ReceiveCompleted? – Boo

+0

MSMQ (после Windows 2000) будет использовать столько памяти для тел сообщений, сколько он считает безопасным в использовании. Если вы бежите на свободной памяти, тогда сообщения будут оставлены на диске для чтения по требованию. В основном MSMQ является самоограничивающим (или, более точно, ограниченным ОС). –

+0

В этой статье (http://support.microsoft.com/default.aspx?scid=kb;EN-US;901279) указано 63 обработчика async для каждой системы, а не для каждой очереди. –

Смежные вопросы