Perfmon显示我的WCF服务的21亿个实例

时间:2011-06-28 21:12:32

标签: wcf instance

我有一个WCF服务,每三分钟只有大约15-20个客户端呼叫一次。我有PerfMon连接它,它显示我有2147483698实例。那不可能,可以吗?我在web.config中有maxConcurrentInstances="1000",我分别使用Multiple和PerSession Concurrency和InstanceMode。
此WCF服务还会导致一些其他问题,例如使lsass.exe使用所有可用的CPU。

修改详情 它托管在IIS 6中,并使用带有WsHttpBinding的端点:

<wsHttpBinding>
    <binding name="WSHttpBinding_IWCFService" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="1048576">
    <readerQuotas maxDepth="32" maxStringContentLength="65536" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="Message">
        <message clientCredentialType="Certificate" negotiateServiceCredential="true"
            algorithmSuite="Default" />
      </security>
   </binding>
</wsHttpBinding>

我将并发设置为多个,因为我希望创建的服务对象能够一次处理多个请求(即多个线程)。我想我可以将InstanceMode设为Single而不是PerSession,但这会有所不同吗?

编辑下一个早晨
所以,我今天早上开始打开PerfMon,所有内容都是0,我删除然后在IIS中创建了服务,并通过修改配置重新启动了服务。然后我看着实例爬升到1000(我的配置中的最大值),此时没有更多的呼叫进入。我使用配置重新启动服务,实例数量立即下降到0,然后5秒后射击再次高达20亿 我觉得这可能只是因为Perfmon不知道如何处理从WCF服务中抛出的任何疯狂。

问题确实似乎是在这个特定版本的客户端中并不总是正确关闭频道,不幸的是,我现在无法全部了解它们。 (我有另一个版本的客户端和服务,有大约130个客户端,这不是问题。)是否有一些配置我可以设置服务以帮助解决问题?根据我的阅读,Single InstanceMode和Multiple Concurrency是合适的。它可以解决实例问题并仍然提供异步访问,我不必担心交叉线程问题,因为服务方法只更新数据库中的表。
想法?

1 个答案:

答案 0 :(得分:0)

听起来这些实例没有被正确处理掉。

作为测试,您可以将以下代码行附加到客户端调用的方法的实现(在服务中),并查看实例数是否减少:

 OperationContext.Current.InstanceContext.
        ReleaseServiceInstance();

你也可以尝试切换到per-call并摆脱并发的东西(我无法从你的问题中判断出该选项是否适合你正在做的事情)?每次调用将为客户端进行的每个方法调用创建一个单独的实例,然后处理该实例。

有一篇很好的文章介绍了实例管理here的所有细节,希望你会在那里找到有用的东西:)