Real-time Distributed Tracing for Website Performance and Efficiency Optimizations

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

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

Bài mô tả công cụ nội bộ inCapacity; các con số latency trong bài là giá trị minh hoạ, không phải số đo thật.

Bối cảnh

  • Kiến trúc hướng service của LinkedIn: một lượt xem trang fan-out ra nhiều service ở nhiều tầng, nhiều mức sâu. Dev phụ thuộc service phía sau nhưng không thấy quan hệ và hiệu năng của chúng, nên khó tối ưu và khó tìm nguyên nhân gốc.
  • LinkedIn đã có tracing phân tán phủ khắp: trace của các service trong cùng một request gốc được Samza gom lại và phát thành một event trên message bus (Kafka) để phân tích realtime.

Thay đổi chính

  • inCapacity đọc kết quả từ Samza, dựng call graph theo thời gian thực. Mỗi request mang request ID (để ghép trace) và pagekey (trang nào khởi phát), nên có thể phân tích theo trang/ứng dụng chứ không chỉ theo từng service hay người gọi trực tiếp.
  • Self-latency: latency của một API trừ đi thời gian chờ các lời gọi xuống dưới (gọi song song thì trừ phần chồng nhau). So self-latency với tổng latency để biết chậm do chính nó hay do phía sau. Call path gộp mỗi 15 phút.
  • Tìm nguyên nhân gốc tự động: so call graph giữa hai khoảng thời gian, xếp call path theo mức tăng latency, đi dần xuống: ở mỗi tầng, nếu phần tăng của self-latency lớn hơn phần tăng của thời gian chờ thì tầng này là thủ phạm, không thì đi tiếp xuống. Ví dụ trong bài: latency tăng 24,4 ms, lần qua hai tầng tới Service_D, nguyên nhân là hết session DB.
  • Chi phí và capacity theo trang: chi phí của một trang = tổng chi phí các service nó gọi, xấp xỉ bằng số lần gọi × latency. Nếu một trang dự kiến tăng 20% lượt xem quý tới, tính được phần cứng cần thêm cho mọi service phía sau; ước được chi phí của tính năng mới trước khi làm.
  • Dependency analysis: biết trang nào bị ảnh hưởng nhiều nhất nếu khai tử một API.

Vì sao

Bài học cho SWE

  • Gắn ID của điểm khởi phát (trang, tính năng) vào trace, không chỉ request ID; nhờ đó tính được chi phí theo sản phẩm.
  • Self-latency là cách đơn giản để đi từ triệu chứng ở đầu xuống tới service thật sự chậm.
  • Gộp trace theo khoảng thời gian (15 phút) đủ cho phân tích xu hướng; vẫn giữ một số call tree mẫu để xem chi tiết.

Liên quan