使用nettcp绑定时的WCF性能问题 - 高CPU

时间:2015-03-05 17:58:25

标签: wcf nettcpbinding

我使用NetTcp绑定(在Windows Server 2012 Datacenter上的IIS 8上托管)的WCF服务有一个不明确的CPU问题 我在一个服务中持有WCF客户端(代理)池并使用它来连接另一个服务。 我们的问题是,当持有池的客户端服务没有正确处理时(这可能是我们的情况),那么服务器正在旋转到100%的CPU并保持一段时间(持续时间很大程度上取决于数量)池中的客户尚未关闭) 我们在服务器上使用InstanceContextMode.Single和多个并发模式,没有可靠的会话..

服务器配置:

    <bindings>
  <netTcpBinding>
    <binding name="NetTcpBinding_IRecommenderService" closeTimeout="00:00:01.5000000" openTimeout="00:00:01.5000000" receiveTimeout="00:00:01.5000000" sendTimeout="00:00:01.5000000" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="2147483647" maxReceivedMessageSize="2147483647" listenBacklog="2147483647" transactionFlow="false">
      <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="2147483647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647"/>
      <reliableSession enabled="false"/>
      <security mode="None"/>
    </binding>
  </netTcpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="false" />
      <serviceThrottling maxConcurrentCalls="4000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" />
    </behavior>
    <behavior name="Unthrottled">
      <serviceMetadata httpGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="false" />
      <serviceThrottling maxConcurrentCalls="6000" maxConcurrentSessions="6000" maxConcurrentInstances="6000" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="UnthrottledServiceEndpoint">
      <dispatcherSynchronization maxPendingReceives="10000" asynchronousSendEnabled="true" />
    </behavior>
  </endpointBehaviors>
</behaviors>

客户端配置:

    <client>
  <endpoint address="net.tcp://this-will-be-given-at-runtime:12345/an-invalid-service-too/"
    behaviorConfiguration="UnthrottledClientEndpoint" binding="netTcpBinding"
    bindingConfiguration="NetTcpBinding_IRecommenderService" contract="RecommenderClient.IRecommenderService"
    name="IRecommenderServiceClient_nettcp" />
</client>

...

    <behavior name="UnthrottledClientEndpoint">
      <dispatcherSynchronization asynchronousSendEnabled="true" />
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>

...

任何答案都将不胜感激 谢谢, 鹭。

1 个答案:

答案 0 :(得分:1)

//当没有正确处理持有池的客户端服务时(这可能是我们的场景)//

您是说您为WCF连接编写了自己的“池”吗?

我不会这样做。我会在每次使用后使用代理并处理它......以避免你所描述的确切内容。

如果你不能“信任”你的dotnet消费者关闭/处理的东西,那么我会建议(像我一样)编写一个ClientWrapper程序集,他们必须通过它......你确保你关闭它代理。

我把它比作IDataReader。如果我将IDataReaders返回给客户端,我不能保证消费者处理它们。阿卡,它超出了我的控制范围。没门。我使用IDataReader,处理它,然后给它们一些(序列化的?)对象。消费者永远不会得到一些他们可能忘记处理的东西,并把我搞砸了。

下面是我典型的“客户端”包装代码。

private IMyService GetTheProxy()
{
    string endPointName = "MyEndPointName";
    ChannelFactory<IMyService> factory;
    //Use default endpoint
    Console.WriteLine("endPointName='{0}'", endPointName);

    factory = new ChannelFactory<IMyService>(endPointName);
    IMyService proxy1 = factory.CreateChannel();
    return proxy1;

}

public string GetAString()
{
    string returnValue = null;
    IMyService proxy1 = this.GetTheProxy();

    using (proxy1 as IDisposable)
    {
        returnValue = proxy1.GetAString();
        return returnValue ;
    }
}       



public int GetAnInt()
{
    int returnValue = null;
    IMyService proxy1 = this.GetTheProxy();

    using (proxy1 as IDisposable)
    {
        returnValue = proxy1.GetAnInt();
        return returnValue ;
    }
}