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 часов. После этого периода пустые файлы будут удалены. Вы можете настроить это, как описано в моем блоге:
По случайности это кому-нибудь поможет - этот пост в группах Google по легенде msmq Джона Брэкуэлла описывает, как на самом деле полностью очистить все сообщения в хранилище, что иногда желательно / необходимо
https://groups.google.com/d/msg/microsoft.public.msmq.performance/jByfXUwXFw8/i1hVP1WJpJgJ
У меня было 8 ГБ файлов, но сообщений в очередях не было, и службе msmq понадобилось бы около 2 часов, чтобы войти в начальное состояние. Очистка любой очереди заняла бы 10 секунд и привела к огромным скачкам памяти, которые затем не высвобождались в течение нескольких дней, если вообще когда-либо.
Если вы когда-нибудь оказались в такой ситуации, вместо переустановки очереди сообщений вы можете просто выполнить следующие действия:
- Остановить службу очереди сообщений
- Перейдите в хранилище MSMQ (обычно это C:\Windows\System32\msmq\storage)
- Удалите ТОЛЬКО файлы P*.MQ, J*.MQ, R*.MQ и L*.MQ.