2

私は現在、Windows Server 2008 R2 Datacenter x64 VM 上の IIS 7.5 でホストされている WCF サービス (.Net 4.0) として公開されているサービスを使用して、SOA アーキテクチャでアプリケーションを開発しています (実際には、Amazon EC2 の m1.small インスタンスです)。 )。これらのサービスはマシン上でローカルに相互に通信するため、最適なパフォーマンスを得るために netNamedPipeBinding を使用するように設定しました。インスタンス化モードは呼び出しごとで、同時実行は複数に設定されています。

現在、200 ミリ秒から 1 秒の間のチャネルを開くときに断続的な遅延が発生するという 2 つの問題に直面しています。

WCF トレースを有効にしましたが、遅延が次のいずれかのエラーとして現れることがわかりました。

System.IO.PipeException: パイプへの書き込み中にエラーが発生しました: パイプを閉じています。(232、0xe8)。

その後、WCF が再試行され、正常に接続されたように見えます (したがって、遅延が発生します)。2 番目の症状は、アクティビティの実行時に 0.5 秒の遅延が発生することです。

処理アクション「http://tempuri.org/IConnectionRegister/ValidateUriRoute」

これについて私が見つけた唯一のことは、TCP ポート共有に関連している可能性があると考える人がいるということですが、私は名前付きパイプを使用しています。TCP ポート共有サービスを無効にしようとしましたが、違いはありませんでした。

興味深いことに、同じランダム ポートの localhost でリッスンする net.tcp を使用するようにすべてのエンドポイントを変更しようとしましたが、ValidateUriRouteアクティビティ内で 0.5 秒の遅延が断続的に発生しました。

私の WCF 構成は次のようになります。

<system.serviceModel>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
                               multipleSiteBindingsEnabled="false">

      <serviceActivations>

        <add relativeAddress="ConfigurationHost.svc" service="Core.ConfigurationHost" factory="Core.ConfigurationHostFactory" />
        <add relativeAddress="RoutingHost.svc" service="Core.RoutingHost" factory="Core.RoutingHostFactory" />
        <add relativeAddress="AuthenticationHost.svc" service="Core.AuthenticationHost" factory="Core.AuthenticationHostFactory" />

      </serviceActivations>

    </serviceHostingEnvironment>

    <services>

      <service name="Core.ConfigurationHost"
               behaviorConfiguration="Unthrottled">

        <endpoint address="net.pipe://localhost/ConfigurationHost.svc"
                  binding="netNamedPipeBinding"
                  bindingConfiguration="customNetNamedPipeBinding"
                  contract="Core.IConfiguration" />

      </service>

      <service name="Core.RoutingHost"
               behaviorConfiguration="Unthrottled" >

        <endpoint address="net.pipe://localhost/RoutingHost.svc"
                  binding="netNamedPipeBinding"
                  bindingConfiguration="customNetNamedPipeBinding"
                  contract="Core.IRouting" />

      </service>

      <service name="Core.AuthenticationHost"
               behaviorConfiguration="Unthrottled">

        <endpoint address="net.pipe://localhost/AuthenticationHost.svc"
                  binding="netNamedPipeBinding"
                  bindingConfiguration="CustomNetNamedPipeBinding"
                  contract="Core.IAuthentication" />

      </service>

    </services>

    <behaviors>

      <serviceBehaviors>

        <behavior  name="Unthrottled">

          <serviceThrottling maxConcurrentCalls="100"
                             maxConcurrentSessions="100"
                             maxConcurrentInstances="100" />

        </behavior>

      </serviceBehaviors>

    </behaviors>

    <client>

      <endpoint address="net.pipe://localhost/ConfigurationHost.svc"
                binding="netNamedPipeBinding"
                bindingConfiguration="customNetNamedPipeBinding"
                contract="Core.IConfiguration"
                name="Configuration" />

      <endpoint address="net.pipe://localhost/RoutingHost.svc"
                binding="netNamedPipeBinding"
                bindingConfiguration="customNetNamedPipeBinding"
                contract="Core.IRouting"
                name="Routing" />

      <endpoint address="net.pipe://localhost/AuthenticationHost.svc"
                binding="netNamedPipeBinding"
                bindingConfiguration="customNetNamedPipeBinding"
                contract="Core.IAuthentication"
                name="Authentication" />

    </client>

    <bindings>

      <netNamedPipeBinding>

        <binding name="customNetNamedPipeBinding"
                 maxReceivedMessageSize="2147483647"
                 sendTimeout="00:00:30"
                 receiveTimeout="infinite"
                 closeTimeout="00:00:30"
                 openTimeout="00:00:30"
                 maxConnections="500">

          <security mode="None"/>

          <readerQuotas maxDepth="200"
                        maxStringContentLength="2147483647"
                        maxArrayLength="2147483647"
                        maxBytesPerRead="2147483647"
                        maxNameTableCharCount="2147483647" />

        </binding>

      </netNamedPipeBinding>

    </bindings>

  </system.serviceModel>
4

1 に答える 1

0

操作のタイミングにおけるこれらの断続的なブリップは両方とも、名前付きパイプとTCPバインディングの両方が使用する接続プールメカニズムの副産物である可能性が高いと思います。接続プールには最大アイドル時間があり、その後アイドル接続がプールから削除されます。これにより、固有の競合状態が発生します。WCFチャネルを確立しようとする試みが、反対側がアイドル状態として破棄したばかりの接続で行われる場合があります。

自分で試したことはありませんが、絶対時間よりもタイミングの一貫性を重視する場合は、バインディングのトランスポートバインディング要素の接続プール設定を調整して、プーリングを無効にする(set MaxOutboundConnectionsPerEndpoint= 0)か、減らすことができます。アイドル接続の発生率(IdleTimeout値の変更)。

その作業を行うことができない場合、または遅延が発生したときに、接続プールがもたらす固有の変動性を考慮しても遅延が発生するはずであると思われる場合は、Microsoftのエンジニアの助けが必要になるでしょう。 WCF実装の内部に深く関わっています。

于 2012-07-12T13:47:10.707 に答える