2011-03-04 50 views
3

我开发了一个.net 3.5应用程序,它使用HTTPWebRequest从供应商Web服务器获取数据,然后返回一个XML文档。在我自己的工作站上,它是XP(32位),它的工作速度非常快。Server 2008上的HTTPWebRequest的性能问题(罚款xp)

在服务器上它要慢得多。供应商的16k响应最多需要20-30秒,而在我的PC上需要1秒。

服务器是在ESX上以64位模式运行Windows Server 2008的虚拟机。我在服务器上安装了Internet Explorer,并在IE中发出相同的请求,与我的应用程序相反,该页面的加载时间与我工作站上的时间相似。

的代码如下:

private static XElement FetchXml(string uri) 
{ 
    int retryInterval = 500; 

    for (int retry = 1; retry < RETRY_MAX; ++retry) 
    { 
     Stopwatch stopWatch = Stopwatch.StartNew(); 

     try 
     { 
      var request = HttpWebRequest.Create(uri); 

      request.Proxy = new WebProxy("<the corporate proxy>", 8080); 

      // 3 minute timeout on individual web requests 
      request.Timeout = 1000 * 60 * 3; 

      using (var response = request.GetResponse()) 
      { 
       using (var stream = response.GetResponseStream()) 
       { 
        using (var reader = new StreamReader(stream)) 
        { 
         XElement xml = XElement.Load(reader); 
         //log.InfoFormat("Fetched (Uri={0}, Size={1} bytes, Elapsed={2:N2}s).", uri, xml.ToString().Length, stopWatch.Elapsed.TotalSeconds); 
         return xml; 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      //log.ErrorFormat("Error fetching Xml (Uri={0}) : {1}", uri, ex.Message); 
     } 
     //log.InfoFormat("Retrying fetch after interval (Attempt#={0}, Interval={1}s)", 
     // retry, (double)retryInterval/1000); 

     System.Threading.Thread.Sleep(retryInterval); 

     // Back off for next retry if it occurs. 
     retryInterval *= 2; 
    } 

    string msg = String.Format("Error fetching Xml - exhausted maximum retries (Uri={0}, MaxRetries={1}).", 
     uri, 
     RETRY_MAX);  

    throw new ApplicationException(msg); 
} 

我已经测试了以下所有度过昨天研究的问题:

ServicePointManager.CheckCertificateRevocationList = false; 
ServicePointManager.DefaultConnectionLimit = 65000; 
ServicePointManager.Expect100Continue = false; 

这些都不帮。我也看到它表明,代理可能会导致这些问题,并可以绕过,不幸的是不在这种环境中,我不认为它可能是代理故障,因为我在我的工作站上使用同一个故障。

我也抓住了一些微软网络监视器的踪迹,有趣的是,从远程站点到我的应用程序的服务器上的数据包大小要小得多。在我的工作站上,它们大约有1400个字节,而在服务器上它们更像是300个字节,虽然我对TCP不太熟悉,但似乎有很多闲谈让http继续构建完整的消息。因此,在我的工作站上,其大约4个入站邮件的总有效负载有3个出站,而在服务器上,它是19个入站邮件,具有相似的出站数量。这可能解释了性能问题,但我不明白为什么会发生。当我在服务器上的IE浏览器中加载页面时,会发送少量的数据包大小的请求。

网络监视器在我的XP工作站:

HTTP:Request, GET http://xml.vendor.com/datapage/, Query:version=6.0 
HTTP:Response, HTTP/1.1, Status: Ok, URL: http://xml.vendor.com/datapage/ 
HTTP:HTTP Payload, URL: http://xml.vendor.com/datapage/ 
TCP:Flags=...A...., SrcPort=2192, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3206279401, Ack=33242842, Win=64512 (scale factor 0x0) = 64512 
TCP:[Continuation to #915]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=2192, PayloadLen=1360, Seq=33242842 - 33244202, Ack=3206279401, Win=65535 (scale factor 0x0) = 65535 
TCP:[Continuation to #915]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=2192, PayloadLen=1360, Seq=33244202 - 33245562, Ack=3206279401, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=2192, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3206279401, Ack=33245562, Win=64512 (scale factor 0x0) = 64512 
TCP:[Continuation to #915]Flags=...AP..., SrcPort=HTTP Alternate(8080), DstPort=2192, PayloadLen=557, Seq=33245562 - 33246119, Ack=3206279401, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=2192, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3206279401, Ack=33246119, Win=63955 (scale factor 0x0) = 63955 

相同的代码+请求的服务器上运行:

HTTP:Request, GET http://xml.vendor.com/datapage/, Query:version=6.0 
HTTP:Response, HTTP/1.1, Status: Ok, URL: http://xml.vendor.com/datapage/ 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24013122, Win=255 (scale factor 0x8) = 65280 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=255, Seq=24013122 - 24013377, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24013377, Win=254 (scale factor 0x8) = 65024 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=254, Seq=24013377 - 24013631, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24013631, Win=253 (scale factor 0x8) = 64768 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=253, Seq=24013631 - 24013884, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24013884, Win=252 (scale factor 0x8) = 64512 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=252, Seq=24013884 - 24014136, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24014136, Win=251 (scale factor 0x8) = 64256 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=251, Seq=24014136 - 24014387, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24014387, Win=256 (scale factor 0x8) = 65536 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=256, Seq=24014387 - 24014643, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24014643, Win=255 (scale factor 0x8) = 65280 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=255, Seq=24014643 - 24014898, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24014898, Win=254 (scale factor 0x8) = 65024 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=254, Seq=24014898 - 24015152, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24015152, Win=253 (scale factor 0x8) = 64768 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=253, Seq=24015152 - 24015405, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24015405, Win=252 (scale factor 0x8) = 64512 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=252, Seq=24015405 - 24015657, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24015657, Win=251 (scale factor 0x8) = 64256 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=251, Seq=24015657 - 24015908, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24015908, Win=256 (scale factor 0x8) = 65536 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=256, Seq=24015908 - 24016164, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24016164, Win=255 (scale factor 0x8) = 65280 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=255, Seq=24016164 - 24016419, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24016419, Win=254 (scale factor 0x8) = 65024 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=254, Seq=24016419 - 24016673, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24016673, Win=253 (scale factor 0x8) = 64768 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=253, Seq=24016673 - 24016926, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24016926, Win=252 (scale factor 0x8) = 64512 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=252, Seq=24016926 - 24017178, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24017178, Win=251 (scale factor 0x8) = 64256 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=251, Seq=24017178 - 24017429, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24017429, Win=256 (scale factor 0x8) = 65536 
TCP:[Continuation to #192]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=256, Seq=24017429 - 24017685, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24017685, Win=255 (scale factor 0x8) = 65280 
TCP:[Continuation to #192]Flags=...AP..., SrcPort=HTTP Alternate(8080), DstPort=58401, PayloadLen=181, Seq=24017685 - 24017866, Ack=3779234716, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=58401, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=3779234716, Ack=24017866, Win=254 (scale factor 0x8) = 65024 

IE服务器获取同一页上:

HTTP:Request, GET http://xml.vendor.com/datapage/, Query:version=6.0 
TCP:Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=53132, PayloadLen=0, Seq=20851875, Ack=2273238303, Win=65535 (scale factor 0x0) = 65535 
HTTP:Response, HTTP/1.1, Status: Ok, URL: http://xml.vendor.com/datapage/ 
HTTP:HTTP Payload, URL: http://xml.vendor.com/datapage/ 
TCP:[Continuation to #345]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=53132, PayloadLen=1360, Seq=20853598 - 20854958, Ack=2273238303, Win=65535 (scale factor 0x0) = 65535 
TCP:[Continuation to #345]Flags=...A...., SrcPort=HTTP Alternate(8080), DstPort=53132, PayloadLen=1360, Seq=20854958 - 20856318, Ack=2273238303, Win=65535 (scale factor 0x0) = 65535 
TCP:[Continuation to #345]Flags=...AP..., SrcPort=HTTP Alternate(8080), DstPort=53132, PayloadLen=557, Seq=20856318 - 20856875, Ack=2273238303, Win=65535 (scale factor 0x0) = 65535 
TCP:Flags=...A...., SrcPort=53132, DstPort=HTTP Alternate(8080), PayloadLen=0, Seq=2273238303, Ack=20856875, Win=16425 (scale factor 0x2) = 65700 

有趣的一点是,在缓慢的请求中,跟踪从不捕获“HTTP Payload”。那里有奇怪的事情吗?一旦请求最终在服务器上完成,尽管如此,数据仍然很好地形成。

+0

+1很好地研究和正确被问到的问题。对不起,我不能有更多的帮助。 – spender 2011-03-04 13:11:41

回答

0

这是通过禁用Windows tcp autotuning来解决的,它似乎一直在表现异常!

感谢,

1

这个答案看起来可能相关......也许.NET是阅读,你可能已经设置了默认的代理设置窒息得到IE正常工作:HTTPWebResponse + StreamReader Very Slow

看到你”在代码中重新设置代理,您可以跳过检测。

+0

嗨 - 感谢您的建议。我刚刚测试过这个,并没有骰子 - 我认为,因为我手动设置代理,它不会尝试获取默认代理。从我的日志看来,最初的响应有点慢,但从那时起,数据的加载速度也非常慢。因此,这将在代理协商之后等。 – DanH 2011-03-04 13:45:34

+0

看看从XP到目的地,然后是服务器和目的地,路线(运行tracert)有什么不同。这将揭示你的数据在哪里经历的情况是不同的。 – 2011-03-18 08:40:32

0

看着你的捕获,看起来好像你的客户端代码TCP堆栈正在向服务器发送一个255字节的TCP窗口。这就是为什么目标代理服务器最多只能发送255个字节。

这是一个您正在运行代码的控制台应用程序吗?其他一些代码是否可能更改TCP窗口大小?