Signalr: Возможная утечка памяти в SignalR

Созданный на 30 янв. 2017  ·  10Комментарии  ·  Источник: SignalR/SignalR

Всем привет,

Проблема может быть связана с #3589
У нас есть signalR версии 2.2.0, размещенный как оконный сервис, сервис отправляет торговые курсы на высокочастотных интервалах сотням браузерных клиентов. Так что у нас много связей, которые приходят и уходят. через некоторое время сервис начинает протекать.
Я записал дамп и сравнил его с базовым дампом, сделанным через несколько минут после запуска службы. ниже результаты:

capture

Как видите, классы SignalR находятся вверху.

ссылка на второй дамп здесь :

Самый полезный комментарий

Но я думаю, что вы, ребята, серьезно должны рассмотреть это как проблему дизайна...

Определенно то, что мы решаем с помощью SignalR для ASP.NET Core.

Все 10 Комментарий

SignalR имеет кольцевой буфер для каждого подключения, в котором хранятся сообщения. Этот размер буфера по умолчанию составляет 1000 сообщений (на соединение). Вы, вероятно, видите, что буферы заполняются, и сообщения будут освобождены (фактически заменены новыми сообщениями), как только буферы будут заполнены. Размер буфера можно настроить с помощью свойства конфигурации IConfigurationManager.DefaultMessageBufferSize . Минимальный размер буфера – 32 (обеспечивается SignalR). Обратите внимание, что уменьшение размера буфера увеличивает вероятность пропуска сообщений (например, при повторных подключениях).

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

У меня есть несколько вопросов относительно кольцевого буфера:

  1. если клиент X регистрируется в группе A, новый кольцевой буфер из 1000 сообщений выделяется группе A, когда этот клиент отключается, вы, ребята, освобождаете этот кольцевой буфер? (при условии, что другие клиенты не подписаны на эту группу A)
  2. если соединение остается активным в течение длительного периода времени, скажем, несколько часов. Справедливо ли предположить, что все 1000 сообщений, которые существуют в буфере, переместятся вверх по цепочке к Gen2 сборщиком мусора?

1) Существует фоновый поток, удаляющий неиспользуемые темы (содержащие кольцевой буфер) — https://github.com/SignalR/SignalR/blob/dev/src/Microsoft.AspNet.SignalR.Core/Messaging/MessageBus. cs#L324
2) Я думаю, это зависит от скорости отправки сообщений, но я бы сказал, что вполне вероятно, что многие из этих сообщений будут переведены в Gen 2.

Спасибо за ответы Музик!

После недели работы с новой конфигурацией я могу подтвердить, что утечки памяти больше нет.

Но я думаю, что вы, ребята, серьезно должны рассмотреть это как проблему дизайна...

Но я думаю, что вы, ребята, серьезно должны рассмотреть это как проблему дизайна...

Определенно то, что мы решаем с помощью SignalR для ASP.NET Core.

@moozzyk @OfirYemini Какая у вас была конфигурация серверного концентратора? Есть ли что-то кроме изменения GlobalHost.Configuration.DefaultMessageBufferSize на 32 ? Если есть, можно ли дать представление, поделившись некоторым кодом?

Изменение DefaultMessageBufferSize — единственное, что требуется для уменьшения размера буферов.

всем привет!

у нас тут то же самое

image

поэтому вопрос DefaultMessageBufferSize = 32 поможет нам в этом случае?

да Роман, помогло

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

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

JoergTiedemann picture JoergTiedemann  ·  3Комментарии

Vaccano picture Vaccano  ·  5Комментарии

niravpatel picture niravpatel  ·  7Комментарии

raRaRa picture raRaRa  ·  7Комментарии

markrendle picture markrendle  ·  4Комментарии