我在相当苛刻的环境中使用WCF。我观察到的一个行为是我采取了一些调用冷启动的行为。当我第一次启动正在调用服务的客户端时,第一次调用似乎有很多失败。例如,我可以看到第一个说十个呼叫通过然后接下来的200个呼叫都失败了一次。我是异步地与服务交谈。然后该服务运行并响应良好。我可以看到它是一个端点(可能)问题而不是操作问题,因为多个不同的操作都将失败。感觉就像有一个锁并且端点停止并重置自己然后很好,尽管我没有证据支持这一点。
服务器端跟踪没有错误。我的客户端日志显示了很多以下异常:
System.ServiceModel.CommunicationException:服务器未提供有意义的回复;这可能是由于合同不匹配,过早的会话关闭或内部服务器错误造成的。
我已经考虑过实现平滑算法来平衡服务调用,因为在启动时往往会有很多它们。还有其他人见过类似的行为吗?感谢。
史蒂夫
编辑:该服务托管在Windows服务中。
编辑:感谢评论人员。
我从一开始就将各个队列上的数字设置得相当高。我对如何扩展WCF服务有一些熟练的知识。我允许2048个并发连接。我已经设置了listenBackLog等......
我为前1000次调用实现了平滑,这似乎得到了它。它可能与JIT有关,但我没有证据。暂时我会离开它,看看它是否再次发生。
答案 0 :(得分:2)
出于兴趣,您如何托管WCF服务器? IIS具有方便的池(通过NLB,例如F5),但具有应用程序池回收问题,以及由IIS产生(首次要求)应用程序池/域/等首先导致的滞后。自托管(Windows服务等)往往更加线性且可预测性能,特别是如果(在服务启动期间)您强行加载所有内容,可能是通过向自己提出请求(如果您看到我的意思)。
如果您不需要群集服务,请考虑自托管服务。看看是否有帮助。
答案 1 :(得分:1)
您是否尝试增加端点的排队连接数?它可能是10个排队,而.NET CLR是JITing你的代码,其余的连接被拒绝,直到你的代码开始运行。
答案 2 :(得分:0)
这是一个较老的主题,但我发现自己处于类似情况。 OP表示
我为前1000次调用实现了平滑,这似乎得到了它。
他说“平滑”是什么意思我做了谷歌搜索,它似乎不是一个关键词......