web-dev-qa-db-ja.com

Django:CONN_MAX_AGEは接続を保持しますが、PostgreSQLで再利用しません

DjangoセットアップはDjango 1.6.7およびUbuntu 14.04 LTS上のPostgres 9.3を使用しています。

いつでも、サイトはPostgreSQLデータベースへの約250の同時接続を取得します。これは、2.5 GHzのクアッドコアXeon E5-2670であり、16 GBのRAMを備えています。その特定のマシンの1日の平均負荷は20〜30です。

時々、データベースへの接続がタイムアウトすることについてメールで監視センターに届きます。ある種の接続プールを有効にすると、この問題を軽減し、データベースの負荷を少し下げることができます。

Django 1.6を使用しているため、利用可能な組み込みのプールがあります。ただし、CONN_MAX_AGEを10秒または60秒に設定すると、同時接続数はすぐに最大許容設定(通常の設定の約2倍)、および接続が拒否され始めます。

そのため、どのような理由であれ、接続[〜#〜] are [〜#〜]が持続しているように見えますが、接続ARE NOTは再利用されています。

これの原因は何でしょうか?

PS。 --worker-class = eventletでgunicornも使用しています。おそらくこれが私たちの悩みの原因ですか?

17
synic

さらに実験を行った結果、問題の原因は確かにgunicornのイベントレットワーカークラスにあることがわかりました。各マイクロスレッドは独自の永続的な接続を作成しましたが、それらを再利用する方法はまったくありませんでした。

Eventletを無効にすると、Webサーバーの負荷が増加しますが(それほどではありません)、postgresの負荷は平均3に減少しました。30から。

18
synic