Finding memory leaks with Memtrace

Bài tóm tắt Jane Street 2020 3. Quy mô lớn Độ khó: Trung bình

Jane Street · 2020 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc

Phần lớn bài là hướng dẫn dùng viewer; wiki chỉ giữ phần về thay đổi cách profile bộ nhớ.

Bối cảnh

  • Trước đó OCaml có Spacetime: ghi mọi lần cấp phát. Tìm leak tốt nhưng overhead cao, cần một cấu hình compiler riêng, profile rất lớn và cần rất nhiều RAM để xử lý.
  • OCaml 4.11 (2020) thêm hỗ trợ profile bộ nhớ thống kê trong runtime (Jacques-Henri Jourdan ở CNRS và Stephen Dolan của Jane Street): callback trên sự kiện GC cho một mẫu các lần cấp phát.

Thay đổi chính

  • Thư viện Memtrace ghi sự kiện cấp phát/thu hồi của mẫu đó vào định dạng nhị phân gọn; Memtrace viewer phân tích và hiển thị. Cả hai mở mã nguồn.
  • Bật bằng biến môi trường MEMTRACE sau một dòng Memtrace.trace_if_requested (); dùng compiler thường, mọi nền tảng, overhead đủ thấp để chạy trong production.
  • Viewer: icicle graph theo nơi cấp phát (chia ngược về caller), đồ thị heap theo thời gian, lọc theo "còn sống trong khoảng t1–t2" và "cấp phát trong khoảng t3–t4" để tách object sống lâu hợp lệ khỏi leak.
  • Thư viện cho phép viết phân tích riêng, ví dụ phân bố tuổi thọ object tạo trong một hàm hàng đợi để thấy producer nhanh hơn consumer mà không có backpressure.

Vì sao

  • Lấy mẫu thay vì ghi hết đổi độ chính xác lấy khả năng chạy ở môi trường thật, nơi leak thật sự xảy ra.
  • Theo bài, sau vài tháng dùng nội bộ, phần lớn leak tìm được chỉ với trực quan hoá cơ bản và câu "khoan, cái gì đây?".

Bài học cho SWE

  • Profiler đủ rẻ để để sẵn trong production đáng giá hơn profiler đầy đủ chỉ chạy được trong môi trường đặc biệt.
  • Leak và hàng đợi dồn trông giống nhau trên đồ thị heap; phải xem tuổi thọ object chứ không chỉ tổng.

Liên quan