BÀI 6: ĐỌC HIỂU DASHBOARD – CÁCH SĂN LÙNG "SLOW QUERY" VÀ "N+1 PROBLEM" BẰNG APM
Chào các bạn! Ở bài trước, chúng ta đã kết nối thành công ứng dụng Laravel vào Elastic APM. Dữ liệu đã đổ về cuồn cuộn. Thế nhưng, nhìn vào một giao diện đầy biểu đồ, con số và các đường loằng ngoằng trên Kibana, làm sao để tìm ra "vùng đại phẫu" giúp hệ thống nhanh hơn gấp 2, gấp 3 lần?
Hôm nay, mình sẽ hướng dẫn các bạn cách đọc hiểu Dashboard APM và sử dụng nó như một chiếc kính hiển vi để săn lùng 2 "hung thủ" giấu mặt khiến web chạy như rùa: Slow Query (Truy vấn chậm) và N+1 Query Problem.
1. Bản đồ tổng quan: Bắt đầu từ đâu?
Khi click vào Service của bạn trên Kibana APM, đập vào mắt sẽ là tab Transactions. Đây là nơi bạn nên tập trung đầu tiên.
Hãy chú ý vào bảng danh sách các Transaction bên dưới biểu đồ. Mặc định Kibana sẽ sắp xếp theo lượng Request nhiều nhất. Nhưng để tối ưu hiệu năng, bạn hãy bấm vào cột Impact (Mức độ ảnh hưởng) hoặc Latency (Độ trễ).
- Impact là chỉ số thông minh kết hợp giữa Thời gian chạy và Tần suất gọi. Một Request chậm 10 giây nhưng cả ngày chỉ có 1 người gọi thì Impact sẽ thấp hơn một Request chậm 1 giây nhưng bị gọi 100.000 lần/giờ.
- Hãy chọn top 3 Transaction có Impact cao nhất để tiến hành "mổ xẻ".
2. Săn lùng "Slow Query" trong vài nốt nhạc
Click chọn một Transaction có độ trễ cao (ví dụ: GET /api/v1/products). Kéo xuống phần Trace sample, bạn sẽ thấy biểu đồ thác nước (Waterfall) hiển thị chi tiết hành trình.
Lúc này, hãy tìm các thanh Span có màu Xanh dương hoặc Tím (thường đại diện cho Database như MySQL, PostgreSQL, MongoDB...).
Cách phát hiện:
Nếu bạn thấy một thanh Span đơn lẻ kéo dài ngoằn ngoèo, chiếm đến 70-80% tổng thời gian của cả Transaction (ví dụ: Cả request mất 2 giây, riêng thanh SELECT FROM orders... đã nuốt hết 1.8 giây). Đó chính là Slow Query!
Tuyệt chiêu của Elastic APM:
Bạn không cần phải đoán câu lệnh đó là gì. Hãy click thẳng vào thanh Span đó. Một pop-up sẽ hiện ra hiển thị chính xác 100% câu lệnh SQL đang chạy ngầm dưới code, kèm theo các thông số cấu hình.
- Việc của bạn lúc này là copy câu SQL đó, bật Tool DB lên và chạy
EXPLAINđể xem có phải do thiếu Index hay không. Quá nhanh và bớt đau đầu!
3. Vạch trần lỗi kinh điển "N+1 Query"
Lỗi N+1 Query xảy ra khi code của bạn vòng lặp qua một danh sách dữ liệu, và với mỗi phần tử lại vô tình bắn thêm một câu lệnh SELECT vào database để lấy dữ liệu liên quan (ví dụ: Lấy 100 bài viết, rồi duyệt qua từng bài viết để lấy thông tin Tác giả).
Trên Logs truyền thống, bạn sẽ thấy mọi thứ vẫn trả về 200 OK. Nhưng trên Elastic APM, hung thủ sẽ phải lộ diện hoàn toàn.
Cách nhận diện trên biểu đồ Waterfall:
Khi bạn cuộn màn hình xuống và thấy một hiện tượng kỳ lạ: Hàng trăm thanh Span nhỏ tí hon, giống hệt nhau về nội dung câu lệnh SQL, xếp chồng chất hoặc nối đuôi nhau kéo dài vô tận.
[Transaction] GET /api/v1/posts (Total: 1.5s)
├── SELECT * FROM posts ------------------------> (10ms)
├── SELECT * FROM users WHERE id = 1 -> (2ms)
├── SELECT * FROM users WHERE id = 2 -> (2ms)
├── SELECT * FROM users WHERE id = 3 -> (2ms)
... (và 97 câu lệnh tương tự phía dưới)
Nhìn vào "mớ bòng bong" xếp lớp này, bạn biết ngay code đang bị dính N+1.
- Cách xử lý: Quay lại code backend và sử dụng cơ chế Eager Loading (Trong Laravel là hàm
with(), trong Node.js Sequelize làinclude...) để gộp 100 câu lệnh SELECT nhỏ kia thành đúng 1 câu lệnh duy nhất sử dụngWHERE IN. Request của bạn lập tức sẽ giảm từ 1.5 giây xuống còn 50 mili-giây!
Lời kết & Bài học tiếp theo
Đọc hiểu Dashboard APM giống như việc bạn có thêm một cặp mắt X-quang để nhìn thấu cấu trúc vận hành của hệ thống. Từ nay, không còn những cuộc tranh cãi cảm tính kiểu "Do code em chậm" hay "Do database anh yếu", tất cả đều nói chuyện bằng con số và bằng chứng trực quan trên APM.
Chúng ta đã làm chủ việc giám sát một ứng dụng đơn lẻ (Monolith). Vậy nếu hệ thống của bạn tách thành các Microservices thì sao? Request từ Service A gọi sang Service B rồi gọi sang Service C, làm sao APM kết nối được?
Ở Bài 7 (Bài cuối của Series): Advanced APM – Distributed Tracing trong kiến trúc Microservices, chúng ta sẽ cùng giải mã bài toán nâng cao này nhé!
Đừng ngần ngại chia sẻ ảnh chụp màn hình Dashboard APM của bạn bên dưới nếu cần mình tư vấn cách tối ưu nhé!
All rights reserved