Quay lại danh sách case study
Xử lý tràn bộ nhớ trên Production
Truy vết và khắc phục sự cố memory leak khiến server liên tục khởi động lại.
Bối cảnh
Dịch vụ fintech viết bằng Node.js gặp hiện tượng tràn RAM và crash liên tục sau 2 ngày chạy trên production.
Vấn đề cần xử lý
Ứng dụng tiêu thụ RAM tăng dần không giảm, nguyên nhân chưa được xác định rõ.
Hướng xử lý đề xuất
Chụp heap snapshot bằng lệnh node --inspect, phát hiện các object lớn bị giữ lại trong một biến global cache không giới hạn dung lượng.
Câu trả lời mẫu khi phỏng vấn
Tôi tiến hành lấy heap snapshot từ môi trường staging có tái hiện tải giả lập. So sánh giữa hai thời điểm khác nhau, tôi thấy lượng instance của lớp xử lý thông báo tăng vọt do bị lưu trữ vĩnh viễn trong một mảng toàn cục. Tôi đã khắc phục bằng cách chuyển sang dùng WeakMap và áp dụng thuật toán LRU Cache.
Trade-off
Sử dụng LRU Cache có thể khiến một số dữ liệu cũ bị xóa khỏi bộ nhớ sớm hơn, phải truy vấn lại database nhưng đổi lại sự ổn định tuyệt đối của tiến trình.
Kết quả kỳ vọng
Lượng RAM tiêu thụ ổn định ở mức 300MB, chấm dứt hoàn toàn tình trạng OOM (Out Of Memory) crash.
Bài học khi trả lời phỏng vấn
Không bao giờ dùng biến toàn cục để lưu trữ dữ liệu động mà không có cơ chế giới hạn kích thước hoặc tự động dọn dẹp.