Django: CONN_MAX_AGE vẫn duy trì các kết nối, nhưng không sử dụng lại chúng với PostgreQuery


16

Tôi đã có một thiết lập django đang sử dụng Django 1.6.7 và Postgres 9.3 trên Ubuntu 14.04 LTS.

Tại bất kỳ thời điểm nào, trang web cũng nhận được khoảng ~ 250 kết nối đồng thời với cơ sở dữ liệu PostgreQuery, đó là Quad Core Xeon E5-2670 với tốc độ 2,5 GHz và có 16GB ram. Trung bình tải trên máy cụ thể đó trong suốt cả ngày là khoảng 20 đến 30.

Thỉnh thoảng tôi sẽ nhận được email trong sentry về việc kết nối thời gian tới cơ sở dữ liệu và tôi cho rằng việc kích hoạt một số loại kết nối sẽ giúp giảm thiểu vấn đề này, cũng như giảm tải cho cơ sở dữ liệu một chút.

Vì chúng tôi đang sử dụng Django 1.6, chúng tôi có sẵn tính năng tổng hợp sẵn cho chúng tôi. Tuy nhiên, khi tôi đặt CONN_MAX_AGE thành 10 giây hoặc 60 giây, gần như ngay lập tức số lượng kết nối đồng thời nhảy đến cài đặt tối đa được phép (gấp đôi những gì chúng ta thường thấy) và các kết nối bắt đầu bị từ chối.

Vì vậy, dường như lý do gì bao giờ hết, các kết nối ĐƯỢC kiên trì, nhưng họ KHÔNG được tái sử dụng.

Điều gì có thể là nguyên nhân của việc này?

Tái bút Chúng tôi cũng đang sử dụng gunicorn với --worker-class = eventlet. Có lẽ đây là nguồn gốc của tai ương của chúng ta?

Câu trả lời:


18

Thực hiện thêm một số thử nghiệm, tôi đã thấy rằng nguyên nhân của vấn đề của chúng tôi thực sự là lớp nhân viên sự kiện của gunicorn. Mỗi microthread tạo ra kết nối liên tục của riêng nó và không có cách nào để sử dụng lại bất kỳ cái nào trong số chúng.

Việc vô hiệu hóa eventlet đã khiến tải trên máy chủ web của chúng tôi tăng lên (nhưng không nhiều), nhưng tải postgres hiện giảm xuống mức trung bình là 3. Từ 30.


2
Bạn vừa tiết kiệm cho chúng tôi rất nhiều thời gian! Chúng tôi quan sát chính xác hành vi tương tự và chúng tôi đang sử dụng eventlet. Sẽ cố gắng chuyển sang kết nối tổng hợp và xem nó sẽ hoạt động như thế nào.
im lặng

3
Cập nhật: gộp các kết nối cơ sở dữ liệu với pgBouncer dường như để giải quyết vấn đề (chúng tôi vẫn đang sử dụng eventlet)
silentser

Rõ ràng cũng có psycogreen: pypi.python.org/pypi/psycogreen/1.0 (Tôi đã không thử nó khi tôi đặt CONN_MAX_AGE về 0, hệ thống của chúng tôi phải mất 20ms để tạo kết nối DB nên chúng tôi không cần phải gộp chung)
Darren

1
Tôi đã mất một thời gian để tìm ra câu trả lời cho cùng một vấn đề chính xác mà chúng tôi đang gặp phải.
Alper
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.