CodeReady
Quay lại danh sách case study

Khắc phục sự cố tràn bộ nhớ do cache không giới hạn

Giải quyết tình trạng Memory Leak trên dịch vụ microservice Node.js sau vài ngày chạy liên tục.

Bối cảnh

Một dịch vụ microservice quản lý thông tin người dùng được viết bằng Node.js thường xuyên bị khởi động lại tự động trên Kubernetes sau khoảng 3 ngày hoạt động do vượt quá giới hạn RAM.

Vấn đề cần xử lý

Đội ngũ phát triển đã sử dụng một đối tượng JavaScript thông thường làm bộ nhớ đệm (in-memory cache) để lưu trữ profile người dùng. Do không có cơ chế xóa hoặc giới hạn số lượng phần tử (TTL hoặc LRU), bộ nhớ cứ thế tăng lên đến khi cạn kiệt.

Hướng xử lý đề xuất

Chúng tôi thay thế object thông thường bằng thư viện LRU-cache có giới hạn số lượng item tối đa và thời gian sống (TTL), đồng thời tích hợp APM để theo dõi biểu đồ tiêu thụ heap.

Câu trả lời mẫu khi phỏng vấn

Triệu chứng tràn RAM sau vài ngày là dấu hiệu kinh điển của memory leak do cache không giới hạn. Tôi đã xử lý bằng cách thay thế plain object bằng thư viện LRU cache có cấu hình TTL và max items, kết hợp dùng heapdump để xác định chính xác các đối tượng bị giữ lại trong bộ nhớ.

Trade-off

Việc giới hạn cache có thể làm giảm một chút tỷ lệ hit-cache và tăng số lần gọi database, nhưng đây là đánh đổi bắt buộc để giữ cho ứng dụng không bị sập nguồn.

Kết quả kỳ vọng

Ứng dụng chạy ổn định liên tục nhiều tháng trên môi trường production mà không còn hiện tượng tăng trưởng RAM bất thường.

Bài học khi trả lời phỏng vấn

Mọi dữ liệu lưu trong bộ nhớ tạm của Node.js đều phải có chiến lược dọn dẹp hoặc giới hạn rõ ràng để tránh rủi ro sập tiến trình.