Quay lại danh sách case study
Khắc phục sự cố tràn bộ nhớ định kỳ trên Cluster Node.js
Chẩn đoán và xử lý triệt để hiện tượng tràn bộ nhớ heap khiến các pod Node.js bị restart liên tục trên Kubernetes.
Bối cảnh
Hệ thống Microservices chạy trên Kubernetes liên tục ghi nhận cảnh báo OOM (Out Of Memory) Killed đối với các pod Node.js sau khoảng 2 ngày hoạt động.
Vấn đề cần xử lý
Ứng dụng lưu trữ dữ liệu cache tạm thời trong một biến global dạng Map mà không có cơ chế giới hạn kích thước (TTL), dẫn đến việc bộ nhớ phình to theo thời gian.
Hướng xử lý đề xuất
Thay thế biến global Map bằng thư viện LRU Cache có giới hạn số lượng phần tử và thời gian sống, đồng thời tối ưu hóa cấu hình giới hạn RAM trên Kubernetes.
Câu trả lời mẫu khi phỏng vấn
Khi nhận cảnh báo OOM Kill trên Kubernetes, tôi đã yêu cầu xuất heap dump từ pod trước khi nó bị restart. Phân tích heap dump cho thấy một lượng lớn đối tượng JSON được tích lũy bên trong một biến global cache tự chế không bao giờ được dọn dẹp. Tôi đã đề xuất thay thế toàn bộ bằng thư viện LRU cache có cơ chế eviction rõ ràng, đồng thời bổ sung APM monitoring để theo dõi sát sao lượng heap sử dụng hàng ngày.
Trade-off
Việc dùng LRU cache có thể khiến một số dữ liệu ít truy cập bị xóa khỏi cache sớm hơn, làm tăng nhẹ số lượng truy vấn xuống database nhưng đổi lại sự ổn định tuyệt đối cho tiến trình Node.js.
Kết quả kỳ vọng
Hiện tượng OOM Killed biến mất hoàn toàn, mức tiêu thụ RAM ổn định ở mức 400MB thay vì tăng dần đến mức giới hạn của container.
Bài học khi trả lời phỏng vấn
Tuyệt đối không lưu trữ dữ liệu cache dạng global variable trong Node.js mà không có chiến lược giới hạn dung lượng và tự động hủy.