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も使用しています。おそらくこれが私たちの悩みの原因ですか?
さらに実験を行った結果、問題の原因は確かにgunicornのイベントレットワーカークラスにあることがわかりました。各マイクロスレッドは独自の永続的な接続を作成しましたが、それらを再利用する方法はまったくありませんでした。
Eventletを無効にすると、Webサーバーの負荷が増加しますが(それほどではありません)、postgresの負荷は平均3に減少しました。30から。