Диагностическое приложение замедляется и потребляет память (может быть, драйвер WCF или MongoDB C #)? - PullRequest
2 голосов
/ 09 июня 2019

Примерно через 3 недели мы сталкиваемся с общей проблемой производительности и потребления памяти в нашем приложении.

Эта проблема никогда не возникала раньше, и мы не знаем, как диагностировать ситуацию.

Это происходит «иногда», примерно 1 или 2 раза в неделю, и симптомы следующие:

  • Весь доступ к приложению медленный
  • Память, используемая серверной частью, являетсязначительно увеличивается
  • Но если мы попросим всех пользователей отключить / отключить клиентскую часть, все будет в порядке снова через несколько (около 10) минут, и пользователи смогут снова работать, как будто ничего не произошло раньше.Так что это не утечка памяти.

Технический контекст следующий:

  • Архитектура клиент / сервер / Mongodb в .net 4.6 C #.
  • Клиент - это приложение WPF
  • Сервер - это автономные службы WCF, работающие в качестве службы Windows
  • WCF использует привязки net tcp
  • MongoDB 3.6 с использованием 2.7Драйвер C #

Поскольку проблема действительно общая (все сервисы затронуты и все сервисы обращаются к БД), мы подозреваем, что причиной является либо WCF, либо драйвер MongoDB.

Дополнительные симптомы:

  • Процессор, используемый на серверной части, работает нормально
  • БД не отслеживает ничего особенного

О WCF:

Все клиентские вызовы инкапсулированы в прокси, который гарантирует, что всегда используется схема CreateChannel / channel.Close / channel.Abort.

Привязки:

<binding name="tcp" maxReceivedMessageSize="800000000" maxBufferSize="800000000" openTimeout="00:00:10" receiveTimeout="00:10:00" sendTimeout="00:10:00" >
  <security mode="None" />
</binding>

Поведение (на соответствующем сайте около 100/120 клиентов):

<behavior name="defaultServiceBehavior">
  <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" />
</behavior>

Реализация для дуплекса:

[ServiceBehavior( InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single )]

Для одиночных вызовов:

[ServiceBehavior( InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple )]

О MongoDB :

Я мало что могу сказать, потому что я неи ничего подобного относительно драйвера или БД.

В приложении сервера мы используем эту опцию в строке подключения: maxPoolSize = 500 (а serverStatus указывает, что мы используем только 20).

Мыиметь репликацет и арбитр, размещенные на отдельных серверах.

В нашем контексте OpLog - это примерно 200+ эквивалентных дней.

Журнал указывает на несколько, но очень мало продолжительных обращений (около 10 в час, но менее 5 секунд).

О чем-либо еще

Наш клиент указывает, что нет брандмауэра или антивируса, который мог бы что-либо нарушить.

Конкретно мой вопрос о том, чтобы найти помощь или советы от людей, которые столкнулись с такими проблемами или которые могли бы указать на хороший подход кинструменты настройки, которые могут привести к конкретной диагностике.

Спасибо.

1 Ответ

1 голос
/ 11 июня 2019

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

[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]

Для вашей конфигурации я не считаю необходимым использовать режим PerSession. Услуги PerCall в порядке. При обмене данными PerCall экземпляр службы автоматически освобождается после каждого вызова службы. Дуплексная связь также не требует включения режима сеанса. Nettcpbinding изначально поддерживает дуплексную связь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...