現在、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 のトレース時間を出力する際に興味深いタイミングがいくつか見つかりました。
上のハイライトから下までのタイミングは、次の TraceIdentifier のものです。
- http://msdn.microsoft.com/en-GB/library/System.ServiceModel.MessageWritten.aspx (メッセージが書き込まれました)
- http://msdn.microsoft.com/en-GB/library/System.ServiceModel.Channels.MessageSent.aspx (チャネル経由でメッセージを送信)
- http://msdn.microsoft.com/en-GB/library/System.ServiceModel.Channels.HttpResponseReceived.aspx (HTTP 応答を受信しました)
1 と 2 の間の時間が 2 秒以上かかる理由を説明できません。何か案は?スレッドがスケジュール解除されている可能性はありますか?