大约3周以来,我们在应用程序中遇到了一般的性能和内存消耗问题。
此问题从未发生过,我们也不知道如何诊断这种情况。
这种情况有时“发生”,每周大约1到2次,症状如下:
技术背景如下:
由于问题确实很普遍(所有服务均受到影响,并且所有服务都正在访问数据库),我们怀疑是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秒)。
关于其他内容
我们的客户表示没有防火墙或防病毒软件可以干扰任何事情。
我的具体问题是,该问题是关于从遇到此类问题的人那里寻求帮助或建议的,或者可能表明他们可以使用一种好的方法来设置工具以进行具体诊断的人。
谢谢。
答案 0 :(得分:1)
我没有与您的情况有关的实践经验。据我所知,PerSession模式可以在客户端和特定服务实例之间维护逻辑会话。但是它是如此昂贵,以至于每个客户端在创建新代理时都会获得一个专有服务的新实例。
在整个会话中,服务实例保留内存空间以维护会话状态并在多个消息之间建立上下文状态。
因此,服务器将PerSession服务用作该服务的实例模式会消耗更多资源。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,ConcurrencyMode = ConcurrencyMode.Single)]
对于您的配置,我认为没有必要使用PerSession模式。 PerCall服务很好。在PerCall通信中,服务实例在每次服务调用后自动释放。双工通信也不需要打开会话模式。 Nettcpbinding本机支持双工通信。