Chúng tôi có một Dịch vụ Web sử dụng WebApi 2, .NET 4.5 trên Máy chủ 2012. Chúng tôi đã thấy độ trễ không thường xuyên tăng 10-30ms mà không có lý do chính đáng. Chúng tôi đã có thể theo dõi đoạn mã có vấn đề với LOH và GC.Sử dụng rộng rãi LOH gây ra vấn đề hiệu suất đáng kể
Có một số văn bản mà chúng tôi chuyển đổi sang biểu diễn byte UTF8 của nó (thực sự, thư viện tuần tự mà chúng tôi sử dụng thực hiện điều đó). Miễn là văn bản ngắn hơn 85000 byte, độ trễ ổn định và ngắn: trung bình ~ 0,2 mili giây và ở mức 99%. Ngay sau khi vượt qua ranh giới 85000, độ trễ trung bình tăng lên ~ 1ms trong khi 99% nhảy tới 16-20ms. Profiler cho thấy hầu hết thời gian được sử dụng trong GC. Để chắc chắn, nếu tôi đặt GC.Collect giữa các lần lặp lại, độ trễ được đo sẽ quay lại 0,2 mili giây.
Tôi đã hai câu hỏi:
- đâu trễ đến từ đâu? Theo như tôi hiểu, LOH không được nén chặt. SOH đang được nén chặt, nhưng không hiển thị độ trễ.
- Có cách nào thực tế để giải quyết vấn đề này không? Lưu ý rằng tôi không thể kiểm soát kích thước của dữ liệu và làm cho dữ liệu nhỏ hơn.
-
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)]);
}
Điều này có giúp http://stackoverflow.com/questions/686950/large-object-heap-fragmentation – Sid
không thực sự, điều này nói về phân mảnh và vấn đề của tôi là với độ trễ. –