我目前在诊断一些BasicHttpBinding / ServiceReference性能问题时遇到了一些困难。在某些情况下,当使用Stopwatch
对服务进行同步方法调用时,它的测量值为2.5秒。我对同一个调用进行了Wireshark(pcap)和Fiddler(INET Web代理)分析,并获得了400ms的响应时间,这与最佳情况相差无几。
那么这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个请求同时进行,所以20 ServicePointManager.DefaultConnectionLimit
应该是充足的。无论有没有Fiddler都会发生这种情况,所以我已经删除了重用连接等代理服务器 - 再加上它不需要2秒钟来建立新的服务器连接,是吗?
更新
经过一些更多的诊断后,我在输出ServiceModel跟踪时间时发现了一些有趣的时间。
从顶部突出显示到底部的时间是这些TraceIdentifiers:
我无法解释为什么1到2之间的持续时间可能需要2秒以上。有任何想法吗?线程被取消安排或其他什么可能吗?