2016-10-18 77 views
1

存在一个问题,当系统负载出现问题时,我们在从Stream Reader读取输入流时会看到一些周期性的+ 200ms开销。我想知道有没有其他人看到这个,如果他们已经做了什么来解决它?C#StreamReader导致+ 200ms开销从源读取数据

以下是代码:

string requestBody; 
var streamReaderTime = Stopwatch.StartNew(); 
using (var streamReader = new StreamReader(context.Request.InputStream, context.Request.ContentEncoding)) 
{ 
    var allLines = streamReader.ReadLines(); 
    var request = new StringBuilder(); 
    allLines.ForEach(line => request.Append(line)); 
    requestBody = request.ToString(); 
} 
streamReaderTime.Stop(); 

的ReadLine就是如下:

public static IEnumerable<string> ReadLines(this StreamReader reader) 
{ 
    while (!reader.EndOfStream) 
    { 
    yield return reader.ReadLine(); 
    } 
} 

注意:使用readlines方法()或ReadToEnd的()让人很如果有的话,差别不大

我们在一夜之间运行性能测试,我们只是从绘制streamReaderTime时看到以下行为。 45ms和70ms的之间

enter image description here

单个请求花费来执行,但它可以从它上添加一个固定值,并且有时甚至更大的尖峰的屏幕截图所示。在大约1.5秒之前我看到了它。

如果有人有任何解决方案/建议,将不胜感激。

编辑:我确实有ReadToEnd()而不是ReadLines(),并且摆脱了StringBuilder,但它仍然是相同的开销。是否有替代StreamReader,只是为了测试?它看起来像GC成本,因为有10秒的请求不会影响它,但每秒完全相同的请求将导致此开销发生。此外,我也无法在本地重现它,只是在虚拟环境中发生这种情况。

+0

忘记添加,平均有效载荷大小约为62.6 KiB。有效载荷大小似乎没有任何影响。 –

+0

您的代码会产生大量垃圾,您的秒表正在测量垃圾收集开销的可能性很大。 –

+0

我确实有ReadToEnd()而不是ReadLines(),并且摆脱了StringBuilder,但它仍然是相同的开销。是否有替代StreamReader?它看起来像GC成本,因为请求有十秒钟不会影响它,但每秒一个请求将导致此开销发生。另外我也无法在本地重现它。我会用这些细节更新我的问题。 –

回答

0

这个问题根本不在上面的代码中。问题来自调用者。服务调用是使用一个将连接切换到早期的库,并且开销是连接再次重新建立。