Làm thế nào tôi có thể tìm thấy nguồn rò rỉ bộ nhớ cho mỗi kết nối postgresql?


8

Tôi đang sử dụng postgresql 9.5.4 trên amazon RDS với ~ 1300 kết nối liên tục từ đường ray 4.2 với "yet_statements: false". Trong nhiều giờ và nhiều ngày, chỉ số RDS "Bộ nhớ có thể giải phóng" tiếp tục giảm xuống vô thời hạn nhưng lại nhảy lên một bộ làm việc tương đối nhỏ mỗi khi chúng tôi kết nối lại (khởi động lại máy chủ của chúng tôi). Nếu chúng ta để nó đi quá lâu, nó sẽ chuyển sang không và trường hợp cơ sở dữ liệu thực sự bắt đầu đi vào trao đổi và cuối cùng thất bại. Trừ bộ nhớ có thể giải phóng qua nhiều ngày từ các đỉnh khi chúng tôi khởi động lại, chúng tôi thấy rằng trung bình có 10 MB mỗi kết nối.

nhập mô tả hình ảnh ở đây

Đi sâu vào RSS per-pid từ giám sát nâng cao, chúng ta thấy sự tăng trưởng chậm tương tự trên các kết nối ví dụ nhưng tổng RSS dường như chỉ là một proxy cho việc sử dụng bộ nhớ thực trên mỗi kết nối ( https://www.depesz.com/2012/ 06/09 / how-much-ram-is-postgresql-used / ).

nhập mô tả hình ảnh ở đây

Làm thế nào tôi có thể:

  1. Thay đổi các tham số default.postgres9.5 bên dưới để tránh tăng trưởng bộ nhớ không giới hạn trên mỗi kết nối
  2. Xác định những truy vấn nào gây ra sự tăng trưởng không giới hạn này và thay đổi chúng để ngăn chặn nó
  3. Xác định loại bộ đệm / bộ đệm nào đang gây ra sự tăng trưởng không giới hạn này để tôi có thể sử dụng loại đó để thực hiện một trong các cách trên

nhập mô tả hình ảnh ở đây

Câu trả lời:


3

Nếu bạn đang sử dụng PostgreSQL cộng đồng, câu trả lời dứt khoát để tìm ra bộ nhớ đang hoạt động trên Linux là gì để kết nối với một phụ trợ cồng kềnh với gdb, p MemoryContextStats(TopMemoryContext)và sau đó kiểm tra đầu ra từ tệp nhật ký máy chủ. Nhưng vì bạn không sử dụng PostgreSQL cộng đồng, tôi đoán câu trả lời dứt khoát sẽ là liên hệ với bộ phận hỗ trợ có trả tiền của bạn và yêu cầu họ tìm ra nó cho bạn.

Nguyên nhân rất có thể cho việc này là PostgreSQL giữ bộ đệm siêu dữ liệu cho mỗi kết nối về tất cả các đối tượng cơ sở dữ liệu (bảng, chỉ mục, v.v.) mà nó đã chạm trong suốt thời gian kết nối. Không có giới hạn trên về mức độ lớn của bộ đệm này và không có cơ chế hết hạn. Vì vậy, nếu bạn có hàng trăm ngàn hoặc hàng triệu thứ này, và một kết nối lâu dài cuối cùng sẽ chạm vào từng thứ trong số chúng, thì việc sử dụng bộ nhớ của chúng sẽ tiếp tục phát triển. Giải pháp thông thường cho vấn đề này (giả sử bạn không thể giảm số lượng đối tượng trong cơ sở dữ liệu của mình) là thiết lập nhóm kết nối của bạn để mỗi kết nối có thời gian tồn tại tối đa trước khi bị đóng thay vì được tái chế.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.