3

現在、BasicHttpBinding/ServiceReference のパフォーマンスの問題を診断する際に問題が発生しています。場合によってはStopwatch、サービスへの同期メソッド呼び出しの時間を測定するために を使用すると、2.5 秒と測定されます。この同じ呼び出しの Wireshark (pcap) と Fiddler (INET Web プロキシ) の両方の分析を行ったところ、400 ミリ秒の応答時間が得られました。これは、最良のシナリオとはほど遠いものです。

では、この 2 秒のずれはどこから来るのでしょうか?

私は以下を使用していますBasicHttpBinding

BasicHttpBinding httpBinding = new BasicHttpBinding
    {
        SendTimeout = TimeSpan.FromSeconds(_settings.SendTimeout),
        ReceiveTimeout = TimeSpan.FromSeconds(_settings.SendTimeout),
        MaxReceivedMessageSize = 1024 * 1024 * 100,
        Security =
        {
            Mode = BasicHttpSecurityMode.TransportCredentialOnly,
            Message = { ClientCredentialType = BasicHttpMessageCredentialType.UserName },
            Transport = { ClientCredentialType = HttpClientCredentialType.Basic }
        }
    };

これらの値を使用しています:

ServicePointManager.Expect100Continue = false;
ServicePointManager.DefaultConnectionLimit = 20;
ServicePointManager.MaxServicePointIdleTime = 10000;

圧縮された HttpWebRequests:

public class CompressibleHttpRequestCreator : IWebRequestCreate
{
    WebRequest IWebRequestCreate.Create(Uri uri)
    {
        HttpWebRequest httpWebRequest = Activator.CreateInstance(typeof(HttpWebRequest),
            BindingFlags.CreateInstance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
            null,
            new object[] { uri, null },
            null) as HttpWebRequest;

        if (httpWebRequest != null)
        {
            httpWebRequest.AutomaticDecompression = DecompressionMethods.GZip |
                                                    DecompressionMethods.Deflate;
        }

        return httpWebRequest;
    }
}

この追加の 2 秒がどこに入る可能性があるかについて途方に暮れています。

リクエストは UI/ユーザー ドリブンであり、通常、同時に実行されるリクエストは 1 ~ 5 のみであるためServicePointManager.DefaultConnectionLimit、20 で十分です。これは Fiddler の有無にかかわらず発生するため、接続などを再利用するプロキシを排除しました。さらに、新しいサーバー接続を確立するのに 2 秒もかかりませんでしたか?

アップデート:

さらに診断を行った結果、ServiceModel のトレース時間を出力する際に​​興味深いタイミングがいくつか見つかりました。

ServiceModel 時間

上のハイライトから下までのタイミングは、次の TraceIdentifier のものです。

  1. http://msdn.microsoft.com/en-GB/library/System.ServiceModel.MessageWritten.aspx (メッセージが書き込まれました)
  2. http://msdn.microsoft.com/en-GB/library/System.ServiceModel.Channels.MessageSent.aspx (チャネル経由でメッセージを送信)
  3. http://msdn.microsoft.com/en-GB/library/System.ServiceModel.Channels.HttpResponseReceived.aspx (HTTP 応答を受信しました)

1 と 2 の間の時間が 2 秒以上かかる理由を説明できません。何か案は?スレッドがスケジュール解除されている可能性はありますか?

4

0 に答える 0