【发布时间】:2019-06-05 17:38:04
【问题描述】:
我已经走出了自己的舒适区,所以请耐心等待我提供相关信息。我们刚刚将 IIS 托管的 WCF 服务移至新服务器,调用此服务的客户端开始遇到超时。回收应用程序池后大约 10 分钟就可以了,然后一切都开始超时。我们启用了 WCF 跟踪,我可以看到它说 MaxConcurrentSessions 已超出。文档说该值默认为 2 x [处理器数],因此对我们来说应该是 200。
服务器位于负载平衡器后面,但目前是唯一的服务器。我们注意到性能监视器中的连接以每秒 6 次左右的速度挂起,但在发生超时时会上升到 30 左右,并从那里继续上升。
客户端正在使用wsHttpBinding TransportWithMessageCredential 安全性进行连接。该服务使用配置为用于服务器绑定行为的自定义UserNamePasswordValidator 中的 asp.net 成员资格提供程序来验证消息中提供的凭据。客户端未在其绑定上启用reliableSession。该服务使用默认的SessionMode 和InstanceContextMode,我认为它们分别是Allowed 和PerSession?我们不会在服务代理上调用Close,因为在过去的调查中,我发现这只会在选项上设置一个标志,防止它被重复使用,而且我们的总是超出范围......但现在正在进行测试看看这是否会关闭连接。
如果我正确地解释了 WCF 跟踪日志(而且我不理解我在那里阅读的大部分内容),我们似乎每分钟处理大约 30-40 条消息,并且每个请求在更少的时间内完成少于 300 毫秒(通常要少得多,在极少数情况下接近 1 秒。)我通过计算 1 分钟内的 Processing message n 消息来确定消息的数量。因此,如果我们每分钟获得 40 个,并且这些连接/会话需要 100 秒才能超时和关闭,那么在第一个开始超时之前,我们仍然只能同时打开大约 68 个。没有接近200的限制。单个客户端请求的连接是否获得多个会话?
奇怪的是我们之前没有任何超时并将服务和 web.config 直接复制到新服务器。我相信服务器和 IIS 版本已升级(服务器 2016、IIS 10。)请您帮我识别并提供相关信息以追踪导致这些超时的问题吗?
编辑:
根据我的阅读,一切似乎都表明客户端必须调用Close,否则服务器将保持连接打开,直到超时。但是,在我们的测试中,我们看到 perf 中创建了一个连接。星期一。但无论如何在调用Close 后它仍然保持打开状态。所以我无法确定是否需要关闭是谣言,或者我们是否误解了我们的监控。真正的测试是在任何地方调用Close,看看它是否消除了我们的超时。
在将MaxConcurrentSessions 增加到 400 后,在性能监视器中,我们看到并发会话和实例的数量以每秒大约 1 的速度稳步上升,达到大约 225,最终趋于平稳并徘徊在那里。所以看起来会话没有被关闭。
【问题讨论】:
-
您是否将应用程序池的高级设置与旧服务器进行了比较?
-
是的,没有发现任何差异。