流写头占用太多时间



NewRelic stream &writeheader

我正在New Relic上分析我的WCF服务。有一个WCF服务调用另一个WCF服务。现在我想在调用其他WCF服务时,当它创建请求时,内部进程在某个地方将头写入请求流,这有时很慢。我在New Relic中发现的痕迹告诉我,对于我的一个WCF服务的特定方法,它调用我的另一个WCF服务的方法,大约需要50-60秒,其中95-100 %的时间被System.Net.ConnectStream.WriteHeaders消耗。

Stream[url of WCF service/soap]: WriteHeaders -> 99.78 % time (approx 49 seconds).

我不明白它是什么,如何减少这个时间

我已经搜索过了,我没有发现ConnectStream实际上做了什么或关于它的一些细节,所以我可以找到任何方法来减少它所花费的时间。

请告诉我你的建议。

这听起来像是你正在从客户端流式传输一个大文件,在一个WCF web服务中捕获它,然后将数据重写为新的HttpWebRequest,然后将其发送到另一个主机。我想我会尝试将数据从客户端缓冲到您的web服务,而不是流式传输。

我去年一直在做一个项目,听起来和你正在做的很像。流和缓冲的区别如下:

流读取(从源),然后写入(目标)的交互过程中的数据,你没有太多的控制。如果源文件很大(如gig或更大),则在请求完成之前,WCF请求/响应将在客户机和主机之间来回迭代十几次或更多次。

另一方面,

缓冲在填充请求并将其发送给主机之前累积目标文件的整个内容,从而加快了该过程。由于缓冲(在内存中累积字节所需的时间)带来的性能损失放在了客户机上,因此通常不是问题。

因此,当缓冲来自客户端的数据时,您的主机将收到一个带有完整字节数组的Http请求(假设),该请求已准备好重新打包到您传递给第二个目标WCF主机的请求中。此时,您可以在缓冲和流式传输之间做出选择。在主机上,如果性能很重要,将请求流式传输到第二台主机将提高您的可伸缩性,但(再次)可能会损害您的性能速度。

客户端:

    With binding
      .TransferMode =TransferMode.Buffered 'instead of Transfermode.Streamed                                                              
      .MessageEncoding = WSMessageEncoding.Text
      .TextEncoding = System.Text.Encoding.UTF8
      .MaxReceivedMessageSize = Integer.MaxValue
      .ReaderQuotas.MaxArrayLength = Integer.MaxValue
      .ReaderQuotas.MaxBytesPerRead = Integer.MaxValue
      .ReaderQuotas.MaxDepth = Integer.MaxValue
      .ReaderQuotas.MaxNameTableCharCount = Integer.MaxValue
      .ReaderQuotas.MaxStringContentLength = Integer.MaxValue
      .MaxBufferSize = Integer.MaxValue
      .MaxBufferPoolSize = Integer.MaxValue

主机端:

With binding
      .TransferMode = TransferMode.Buffered
      .MaxReceivedMessageSize = Integer.MaxValue

当您正在调用的服务停滞或并发连接过多时,我也见过同样的情况。如果问题是前者,那么分析WCF服务可能有助于确定根本原因——可能是由于数据库访问或其他I/O绑定进程导致响应缓慢。如果问题是后者,则可以通过调优服务的性能来解决(http://msdn.microsoft.com/en-us/library/ee377061(v=bts.10).aspx)

这也可以表现为ASP的"BeginRequest"。. NET应用程序。很少有BeginRequest或WriteHeaders意味着问题真的是发送数据本身,虽然它可能是如果你有大的有效负载,但在常规调用中,传输的数据是小的,连接时间慢或响应慢的问题将出现在这两个领域。

相关内容

  • 没有找到相关文章