Nguồn: PlanetScale Blog

Tóm tắt

Khi theo dõi một Postgres server và thấy memory usage lên đến 70-90% RAM, phản ứng đầu tiên thường là lo lắng và muốn điều tra. Thực tế, trong hầu hết các trường hợp, memory usage cao trong Postgres không phải là vấn đề — đó là dấu hiệu Postgres đang hoạt động hiệu quả.

Postgres sử dụng bộ nhớ theo nhiều cách khác nhau. Shared buffers là cache in-memory cho data pages: khi Postgres đọc dữ liệu từ disk, các page được lưu vào shared buffers để các lần đọc sau phục vụ từ RAM thay vì disk. Giá trị mặc định 128MB quá nhỏ cho hầu hết hệ thống production — thông thường nên đặt ở mức 25% tổng RAM. Một điểm ít được biết đến: Postgres không chỉ dựa vào shared buffers mà còn tận dụng OS page cache — khi một page bị evict khỏi shared buffers, Postgres có thể đọc từ OS cache mà không cần xuống disk, tạo ra “double-caching” hiệu quả.

work_mem kiểm soát bộ nhớ cho các query operations như sort và hash join. Giá trị mặc định 4MB thường quá nhỏ cho các queries phức tạp, nhưng tăng quá cao có thể gây nguy hiểm khi có nhiều concurrent connections — mỗi operation có thể dùng tới work_mem, và một query có thể có nhiều operations. Cách tiếp cận phù hợp là đặt work_mem thấp globally và tăng lên cho các sessions hoặc roles cụ thể cần xử lý heavy queries. maintenance_work_mem được sử dụng cho các tác vụ bảo trì như VACUUM và CREATE INDEX, thường có thể đặt cao hơn work_mem vì các tác vụ này hiếm khi chạy song song.

Memory usage cao thực sự đáng lo ngại khi: OOM killer đang terminate processes, swap usage tăng cao, hoặc các query thường xuyên spill to disk do work_mem không đủ. Các công cụ như pg_stat_activitypg_buffercache extension giúp phân tích memory usage chi tiết và xác định các vấn đề thực sự.

👉 Đọc bài gốc