MSMQ потребляет большие объемы памяти при обработке сообщений с помощью NServiceBus

У меня есть две службы Windows, которые используют NserviceBus. Один записывает сообщения в очередь, а другой читает из нее и выполняет некоторую обработку. Все очереди являются транзакционными, и конечные точки NserviceBus настраиваются, как показано ниже.

.IsTransactional(true)
.IsolationLevel(IsolationLevel.ReadCommitted)
.MsmqTransport()
.RunTimeoutManager()
.UseInMemoryTimeoutPersister()
.MsmqSubscriptionStorage()
.DisableRavenInstall()
.JsonSerializer()

Проблема в том, что когда большое количество сообщений (более 170 000) ставится в очередь, служба MSMQ (mqsvc.exe) жует довольно много памяти (1,5–2,0 ГБ), и эта память не освобождается как минимум в течение 5–6 ч. Средний размер сообщения составляет около 5 - 10 КБ. И кажется, что чем больше сообщений вы ставите в очередь, тем больше памяти он использует. Использование памяти Windows Services на основе NServiceBus находится в совершенно приемлемых пределах (50–100 МБ) и не увеличивается независимо от того, сколько сообщений они обрабатывают.

Любые идеи о том, почему MSMQ использует столько памяти и занимает много времени, чтобы освободить ее? Спасибо, куча.

2 ответа

Решение

Это совершенно нормально. MSMQ использует хранилище в 4 МБ блоках памяти, которые сопоставляются с файлами в папке "Хранилище". 170 000 сообщений по 5-10 КБ каждое - это 0,85-1,7 ГБ, поэтому неудивительно, что вы выделяете столько виртуальной памяти. Чтобы уменьшить накладные расходы на удаление и создание файлов при удалении или доставке сообщений, файлы хранилища хранятся в течение 6 часов. После этого периода пустые файлы будут удалены. Вы можете настроить это, как описано в моем блоге:

Принуждение MSMQ очистить свои файлы хранения

По случайности это кому-нибудь поможет - этот пост в группах Google по легенде msmq Джона Брэкуэлла описывает, как на самом деле полностью очистить все сообщения в хранилище, что иногда желательно / необходимо

https://groups.google.com/d/msg/microsoft.public.msmq.performance/jByfXUwXFw8/i1hVP1WJpJgJ

У меня было 8 ГБ файлов, но сообщений в очередях не было, и службе msmq понадобилось бы около 2 часов, чтобы войти в начальное состояние. Очистка любой очереди заняла бы 10 секунд и привела к огромным скачкам памяти, которые затем не высвобождались в течение нескольких дней, если вообще когда-либо.

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

  1. Остановить службу очереди сообщений
  2. Перейдите в хранилище MSMQ (обычно это C:\Windows\System32\msmq\storage)
  3. Удалите ТОЛЬКО файлы P*.MQ, J*.MQ, R*.MQ и L*.MQ.
Другие вопросы по тегам