【问题标题】:WCF performance issue when using nettcp binding - high CPU使用 nettcp 绑定时的 WCF 性能问题 - 高 CPU
【发布时间】:2015-03-05 17:58:24
【问题描述】:

我在使用 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>

...

任何答案将不胜感激 谢谢, 萨吉。

【问题讨论】:

    标签: wcf nettcpbinding


    【解决方案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 ;
        }
    }       
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2013-07-24
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多