Table of contents
Mọi vấn đề đều xuất phát từ những thứ đơn giản nhất
Vấn đề gặp phải
Tại 1 web (giấu tên), prod báo về là bị CPU nhảy do chạy job => Điều tra nguyên nhân + hướng khắc phục
Các dữ kiện được cung cấp
- Về việc phát sinh nhảy CPU là sau ngày x, trước ngày x các tác vụ vẫn bình thường
- Phân tích log cho thấy slow-query ở 1 câu query Y => nhưng khi xử lý chạy câu query ở môi trường local không vấn đề gì cả
- Khi job của mình chạy, thì có các job khác cũng chạy đồng thời
Giải quyết vấn đề
Dự đoán ban đầu: Việc tăng CPU khả năng cao là do việc query vào database lâu => từ đó dẫn đến CPU tăng đột ngột, nhưng tại sao, lại chỉ sau ngày x mới bị hiện tượng này, mà không phải bị từ đầu??
Điều tra
Từ (3) => thử cô lập tắt job của mình đi, xem còn có hiện tượng tăng CPU không => kết quả không còn tăng. Tương tự, thử tắc các job khác đi, giữ nguyên job của mình => thấy CPU vẫn tăng. Từ đó rút ra kết luận => Vấn đề xuất phát từ job của bên mình
Kiểm tra coding tương ứng (xem có thay đổi gì không), thì chỉ có 1 sự thay đổi: Bỏ 1 chiếc index ở bảng xử lý (nhưng index đó đã không dùng nữa) => không có sự phát sinh coding ảnh hưởng tới phần logic, query mình xử lý ở job
# (1, 2, 3, 4, 5) là dynamic, phụ thuộc vào một vài điều kiện khác - truy vấn lấy id ở bảng khác theo thời gian phù hợp ... a INNER JOIN b where b.column1 IN (1, 2, 3, 4, 5) ...
Từ (1), (2) => Lấy lại câu query gây slow => để kiểm tra chi tiết
Explain => thì thấy bảng b đang sử dụng partrition => khả năng dẫn đến chậm => nhưng vì nếu chậm thì phải chậm từ đầu => nên khả năng này bỏ ra khỏi nguyên nhân chính
Debug từng dòng, từng
column1 IN
=> thì thấy phát sinh hiện tượng, rất lâu ở 1ID
, nhưng ngoàiID
đó thì chạy vẫn bình thường => dự đoán khả năng là do phát sinh vấn đề ở đây
Kiểm tra lại điều kiện sinh ra
(1, 2, 3, 4, 5)
thì thấy phát sinh 1 bản ghi (bị chậm) mới được thay đổi điều kiện để có thể chạy job (tức là xuất hiện ở trong tệpcolumn1 IN
)=> Kết luận: Bản thân câu query đã chậm rồi, nhưng vì việc lấy dữ liệu ban đầu chưa gặp phải
column1 IN
nào có dữ liệu lớn => do đó chưa phát sinh vấn đề, nhưng nếu có dữ liệu lớn vào => slow query ngay lập tứcKiểm tra lại kết luận, thật vậy, thử update lại điều kiện để không sinh ra
ID
lớn trongcolumn1 IN
=> thì thấy job chạy bình thường, CPU không nhảy đột biến.
Kết: Chúng ta cần phải khoanh vùng vấn đề, sau đó từ từ loại bỏ các dữ kiện không hợp lý => Sau đó cuối cùng, chúng ta cần confirm lại kết quả điều tra 1 lượt, để khẳng định tính đúng đắn. (Cách khắc phục update sau)