当系统出现负载时,我们看到从Stream Reader读取输入流时会出现一些周期性的+ 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来看到以下行为。
单个请求需要45毫秒到70毫秒才能执行,但从屏幕截图中可以看出它增加了固定值,有时甚至更大的峰值。我在大约1.5秒之前看到它。
如果有人有任何解决方案/建议,我们将不胜感激。
编辑:我确实有ReadToEnd()而不是ReadLines(),并且摆脱了StringBuilder,但它仍然是相同的开销。有没有StreamReader的替代品,只是为了测试甚至?它看起来像GC成本,因为有一个请求永远不会影响它,但每秒完全相同的请求将导致这种开销发生。此外,我也无法在本地重现它,只是在虚拟环境中才会发生这种情况。
答案 0 :(得分:0)
此问题根本不适用于上述代码。问题来自呼叫者。服务调用使用的库正在切断早期的连接,而开销是重新建立的连接。