Mam konfigurację django używającą Django 1.6.7 i Postgres 9.3 na Ubuntu 14.04 LTS.
W dowolnym momencie strona uzyskuje około 250 jednoczesnych połączeń z bazą danych PostgreSQL, która jest czterordzeniowym procesorem Xeon E5-2670 o częstotliwości 2,5 GHz i ma 16 GB pamięci RAM. Przeciętne obciążenie tej konkretnej maszyny w ciągu dnia wynosi około 20 do 30.
Czasami dostaję e-maile z wartownikami o przekroczeniu limitu czasu połączeń z bazą danych, i myślę, że włączenie pewnego rodzaju puli połączeń pomoże złagodzić ten problem, a także nieco zmniejszyć obciążenie bazy danych.
Ponieważ używamy Django 1.6, mamy do dyspozycji wbudowane buforowanie. Jednak gdy ustawię CONN_MAX_AGE na 10 sekund lub 60 sekund, prawie natychmiast liczba jednoczesnych połączeń przeskakuje do maksymalnego dozwolonego ustawienia (około dwa razy więcej niż zwykle), a połączenia zaczynają być odrzucane.
Wygląda więc na to, że z jakiegokolwiek powodu połączenia SĄ utrzymujące, ale NIE SĄ ponownie używane.
Co może być przyczyną tego?
PS. Używamy również gunicorn z opcją --worker-class = eventlet. Może to jest źródło naszych nieszczęść?
źródło