Server 2012 で WebApi 2、.NET 4.5 を使用する Web サービスがあります。正当な理由もなく、時折 10 ~ 30 ミリ秒のレイテンシの増加が見られました。問題のあるコード部分を LOH と GC まで突き止めることができました。
UTF8 バイト表現に変換するテキストがいくつかあります (実際、使用するシリアライゼーション ライブラリはそれを行います)。テキストが 85000 バイトより短い限り、待ち時間は安定して短く、平均で 0.2 ミリ秒以下、99% です。85000 の境界を超えるとすぐに、平均レイテンシーは最大 1 ミリ秒に増加し、99% は 16 ~ 20 ミリ秒に跳ね上がります。Profiler は、ほとんどの時間が GC に費やされていることを示しています。確かに、反復間に GC.Collect を配置すると、測定されたレイテンシは 0.2ms に戻ります。
2 つの質問があります。
- レイテンシーはどこから来るのか? 私の知る限り、LOH は圧縮されていません。SOH は圧縮されていますが、待ち時間は表示されません。
- これを回避する実用的な方法はありますか?データのサイズを制御して小さくすることはできないことに注意してください。
--
public void PerfTestMeasureGetBytes()
{
var text = File.ReadAllText(@"C:\Temp\ContactsModelsInferences.txt");
var smallText = text.Substring(0, 85000 + 100);
int count = 1000;
List<double> latencies = new List<double>(count);
for (int i = 0; i < count; i++)
{
Stopwatch sw = new Stopwatch();
sw.Start();
var bytes = Encoding.UTF8.GetBytes(smallText);
sw.Stop();
latencies.Add(sw.Elapsed.TotalMilliseconds);
//GC.Collect(2, GCCollectionMode.Default, true);
}
latencies.Sort();
Console.WriteLine("Average: {0}", latencies.Average());
Console.WriteLine("99%: {0}", latencies[(int)(latencies.Count * 0.99)]);
}