我的服务正在由第三方进行负载测试。启动几分钟后,我们开始看到请求挂了很长一段时间,并且调用者最终超时(60秒后)。
他们正在测试15个用户,每个用户同时使用两个设备,因此总共有30个连接。
该服务是一个简单的外观,可以进行更复杂的操作,可以调用外部系统。将我们的通信基准测试到外部系统看起来好像一切都在我们预期的时间内(200毫秒)。
IIS日志显示了一堆非常高的请求(> 200秒),这些请求最终返回200并且具有Win32错误代码ERROR_NETNAME_DELETD
(错误64
)。我检查了服务日志,并且可以匹配对请求的响应(基于SOAP消息ID),并且可以看到我们最终会使用正确的信息进行响应(尽管客户端已经放弃了)。
关于可能导致此行为的任何想法?我们使用wsHttpBinding在IIS中托管,我们使用WS-Security和x509证书(消息和传输加密)。
我们的服务中没有基准测试日志,但代码是WCF请求到服务器请求的非常简单的映射,发出请求,并将响应映射到WCF响应。我们手动执行此操作,并且不涉及解析(直接分配)。
答案 0 :(得分:0)
经过详细调查,包括获得Microsoft支持,我们遇到了serviceThrottling默认值,特别是maxConcurrentSessions
。我们从perfmon
确定了这一点 - 有一个计数器。我们不确定为什么我们看到这个,因为服务在使用.NET客户端调用时表现得很好。
事实证明,使用CXF的这个应用程序的Java使用者并不尊重WSDL(特别是关于WS-SecureConversation的内容),并且当它关闭连接时关闭会话。
我们的解决方案是将maxConcurrentSessions
提升到一个较高的数字,将inactivityTimeout
设置为低(一分钟)以强制放弃会话。此外,我们将establishSecurityContext
设置为false以避免WSS协商消耗额外的会话。
解决方案不够优雅,因为服务日志中存在关于强制会话关闭的错误,但它修复了我们在此处看到的问题。不幸的是,我们需要WS-Security,所以我们的解决方案需要坚持下去。
我希望这对某人有所帮助,因为这是一个有趣且耗时的问题。