存在一个问题,当系统负载出现问题时,我们在从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的之间
单个请求花费来执行,但它可以从它上添加一个固定值,并且有时甚至更大的尖峰的屏幕截图所示。在大约1.5秒之前我看到了它。
如果有人有任何解决方案/建议,将不胜感激。
编辑:我确实有ReadToEnd()而不是ReadLines(),并且摆脱了StringBuilder,但它仍然是相同的开销。是否有替代StreamReader,只是为了测试?它看起来像GC成本,因为有10秒的请求不会影响它,但每秒完全相同的请求将导致此开销发生。此外,我也无法在本地重现它,只是在虚拟环境中发生这种情况。
忘记添加,平均有效载荷大小约为62.6 KiB。有效载荷大小似乎没有任何影响。 –
您的代码会产生大量垃圾,您的秒表正在测量垃圾收集开销的可能性很大。 –
我确实有ReadToEnd()而不是ReadLines(),并且摆脱了StringBuilder,但它仍然是相同的开销。是否有替代StreamReader?它看起来像GC成本,因为请求有十秒钟不会影响它,但每秒一个请求将导致此开销发生。另外我也无法在本地重现它。我会用这些细节更新我的问题。 –