流编写者花费太多时间WCF

时间:2013-04-16 10:39:31

标签: performance wcf stream httpwebrequest newrelic

NewRelic stream & writeHeaders

提出了类似的问题

我在New Relic上分析我的WCF服务。有一个WCF服务可以调用另一个WCF服务。 现在我想在调用其他WCF服务时,当它创建请求时,内部进程会在某处将头部写入请求流,这有时会很慢。 我在New Relic中找到的跟踪告诉我,对于我的一个WCF服务的特定方法调用另一个WCF服务的方法,需要大约50-60秒,其中{{1} System.Net.ConnectStream.WriteHeaders消耗时间。

95-100 %

我不知道它是什么以及如何减少这段时间?

我已经搜索过,但我没有找到ConnectStream实际做的事情或者有关它的一些细节,所以我可以找到任何方法来减少它所花费的时间。

请告诉我你的建议。

2 个答案:

答案 0 :(得分:0)

听起来您正在从客户端流式传输大型文件,在一个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

答案 1 :(得分:0)

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

对于New Relic中的ASP.NET应用程序,这也可以表现为“BeginRequest”。 BeginRequest或WriteHeaders很少意味着问题实际上是发送数据本身,虽然它可能是你有大的有效载荷,但是在传输数据很少的常规调用中,会出现连接时间慢或响应慢的问题在这两个方面。