负载测试 WCF 服务给出巨大的(>200 秒)响应

Load testing WCF services gives huge (>200 sec) responses

我有一项服务正在由第三方进行负载测试。启动几分钟后,我们开始看到请求挂起很长一段时间,调用者最终超时(60 秒后)。

他们正在测试 15 个用户,每个用户同时使用两个设备,因此总共有 30 个连接。

该服务是调用外部系统的更复杂操作的简单外观。对我们与外部系统的通信进行基准测试看起来好像一切都在我们预期的时间内响应(不到 200 毫秒)。

IIS 日志显示了一堆非常高的请求(> 200 秒),最终执行 return 200 并具有 Win32 错误代码 ERROR_NETNAME_DELETD(错误 64)。我已经检查了服务日志并且可以匹配对请求的响应(基于 SOAP 消息 ID)并且可以看到我们最终确实以正确的信息响应(尽管客户端早已放弃)。

关于可能导致此行为的原因有什么想法吗?我们使用 wsHttpBinding 在 IIS 中托管,我们使用带有 x509 证书(消息和传输加密)的 WS-Security。

我们的服务内部没有基准日志记录,但代码是 WCF 请求到服务器请求、发出请求以及将响应映射到 WCF 响应的非常简单的映射。我们手动执行此操作,不涉及解析(直接分配)。

经过详细调查(包括获得 Microsoft 支持)后,我们遇到了 serviceThrottling 默认值,特别是 maxConcurrentSessions。我们根据 perfmon 确定了这一点 - 有一个计数器。我们不确定为什么我们看到这是服务在使用 .NET 客户端调用时的行为。

事实证明,此应用程序的 Java 使用者使用 CXF,不遵守 WSDL(特别是关于 WS-SecureConversation 的部分)并且在关闭连接时关闭会话。

我们的解决方案是将 maxConcurrentSessions 调高,将 inactivityTimeout 调低(一分钟)以强制放弃会话。此外,我们将 establishSecurityContext 设置为 false 以避免 WSS 协商消耗额外的会话。

该解决方案并不优雅,因为服务日志中充斥着有关强制会话关闭的错误,但它解决了我们在这里看到的问题。不幸的是,我们需要 WS-Security,因此我们的解决方案需要坚持这一点。

我希望这对某人有所帮助,因为这是一个有趣且耗时的问题。