Примерно через 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 секунд).
О чем-либо еще
Наш клиент указывает, что нет брандмауэра или антивируса, который мог бы что-либо нарушить.
Конкретно мой вопрос о том, чтобы найти помощь или советы от людей, которые столкнулись с такими проблемами или которые могли бы указать на хороший подход кинструменты настройки, которые могут привести к конкретной диагностике.
Спасибо.