我在一个相当苛刻的环境中使用WCF。我观察到的一种行为是我称之为冷启动。当我第一次启动一个调用服务的客户端时,在第一次调用中似乎有很多失败。例如,我可以观察前10个呼叫,然后接下来的200个呼叫全部失败。我正在异步地与服务对话。然后,服务运行并正常响应。我可以看到这是一个(潜在的)端点问题,而不是操作问题,因为多个不同的操作都会失败。感觉就像有一个锁,端点停止并重置自己,然后就好了,尽管我没有证据支持这一点。
服务器端跟踪中没有错误。我的客户端日志显示了很多以下异常:
System.ServiceModel.CommunicationException:服务器未提供有意义的回复;这可能是由于约定不匹配、会话过早关闭或内部服务器错误导致的。
我已经考虑过实现平滑算法来平衡服务调用,因为在启动时往往会有很多服务调用。其他人有没有看到过类似的行为?谢谢。
史蒂夫
编辑:该服务驻留在Windows服务中。
编辑:感谢大家的评论。
我从一开始就将各种队列上的数字设置得相当高。关于如何扩展WCF服务,我有一些来之不易的知识。我允许2048个并发连接。我已经设置了listenBackLog等。
我为前1000个调用实现了平滑,这似乎得到了它。这可能与JIT有关,但我没有证据。就目前而言,我将离开它,看看它是否会再次发生。
发布于 2008-12-17 20:42:19
出于兴趣,您是如何托管WCF服务器的?IIS具有方便的池化(通过F5等NLB ),但存在应用池回收问题,以及IIS首先生成(按需)应用池/域/等所导致的滞后。自托管(windows服务等)倾向于更线性和可预测的性能,特别是如果(在服务启动期间)你强制加载所有东西,可能是通过向自己发出请求(如果你明白我的意思)。
如果你不需要集群服务,考虑自托管它。看看能不能帮上忙。
发布于 2008-12-21 01:21:50
您是否已尝试增加终结点的排队连接数?可能有10个正在排队,当.NET CLR正在JITing您的代码时,其余的传入连接将被拒绝,直到您的代码开始运行。
发布于 2009-09-03 18:51:02
这是一个更老的话题,但我发现自己也遇到了类似的情况。操作员声明
我为前1000个调用实现了平滑,似乎得到了它。
他说的“平滑”到底是什么意思我在谷歌上搜索了一下,它似乎不是一个关键词……
https://stackoverflow.com/questions/375937
复制相似问题