CodeReady
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.