Django: CONN_MAX_AGE tetap ada koneksi, tetapi tidak menggunakannya kembali dengan PostgreSQL

16

Saya punya setup Django menggunakan Django 1.6.7 dan Postgres 9.3 di Ubuntu 14.04 LTS.

Setiap saat, situs ini mendapatkan sekitar ~ 250 koneksi simultan ke database PostgreSQL, yang merupakan Quad Core Xeon E5-2670 pada 2.5GHz, dan memiliki ram 16GB. Rata-rata beban pada mesin tertentu sepanjang hari adalah sekitar 20 hingga 30.

Kadang-kadang saya akan mendapatkan email di sentry tentang waktu koneksi ke database, dan saya pikir mengaktifkan semacam pooling koneksi akan membantu mengurangi masalah ini, serta sedikit menurunkan beban pada database sedikit.

Karena kami menggunakan Django 1.6, kami memiliki pooling bawaan yang tersedia untuk kami. Namun, ketika saya mengatur CONN_MAX_AGE ke 10 detik, atau 60 detik, segera jumlah koneksi simultan melompat ke pengaturan maksimum yang diizinkan (yaitu sekitar dua kali lipat dari apa yang biasanya kita lihat), dan koneksi mulai ditolak.

Jadi, tampaknya untuk alasan apa yang pernah, koneksi ADALAH bertahan, tapi mereka TIDAK digunakan kembali.

Apa yang bisa menjadi penyebab hal ini?

PS. Kami juga menggunakan gunicorn dengan --worker-class = eventlet. Mungkin ini sumber kesengsaraan kita?

synic
sumber

Jawaban:

18

Melakukan beberapa percobaan lagi, saya telah menemukan bahwa penyebab masalah kami memang kelas pekerja eventic gunicorn. Setiap microthread membuat koneksi persistennya sendiri, dan tidak ada cara sama sekali untuk menggunakannya kembali.

Menonaktifkan eventlet telah membuat beban di server web kami naik (tetapi tidak banyak), tetapi beban postgres sekarang turun menjadi rata-rata 3. Dari 30.

synic
sumber
2
Anda baru saja menyelamatkan kami banyak waktu! Kami mengamati perilaku yang persis sama dan kami menggunakan eventlet. Akan mencoba untuk beralih ke koneksi pooling dan melihat bagaimana cara kerjanya.
silentser
3
Pembaruan: menyatukan koneksi database dengan pgBouncer tampaknya menyelesaikan masalah (kami masih menggunakan eventlet)
silentser
Rupanya ada juga psycogreen: pypi.python.org/pypi/psycogreen/1.0 (Saya belum mencobanya karena begitu saya mengatur CONN_MAX_AGE ke nol, sistem kami membutuhkan 20 ms untuk membuat koneksi DB sehingga kami tidak perlu mengumpulkan)
Darren
1
Butuh beberapa waktu bagi saya untuk menelusuri jawaban ini untuk masalah yang sama persis dengan yang kami alami.
Alper