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


16

Ubuntu 14.04 LTSでDjango 1.6.7とPostgres 9.3を使用しているdjangoセットアップを持っています。

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

データベースへの接続がタイムアウトすることについて、セントリーでメールを受け取ることがあります。何らかの種類の接続プーリングを有効にすると、この問題を軽減し、データベースの負荷を少し下げることができます。

Django 1.6を使用しているため、組み込みのプーリングを利用できます。ただし、CONN_MAX_AGEを10秒、または60秒に設定すると、同時接続の数はすぐに最大許容設定(通常は約2倍)にジャンプし、接続は拒否され始めます。

だから、それがこれまでどのような理由のために表示され、接続がARE持続、しかし、彼らは行われていません再利用されます。

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

PS。また、-worker-class = eventletでgunicornを使用しています。おそらくこれが私たちの災いの源ですか?

回答:


18

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

eventletを無効にすると、ウェブサーバーの負荷は上がりますが(それほどではありません)、postgresの負荷は平均3になりました。30から。


2
あなたは私たちに多くの時間を節約しました!まったく同じ動作を観察し、eventletを使用しています。接続プーリングに切り替えて、どのように機能するかを確認します。
無言14年

3
アップデート:pgBouncerでデータベース接続をプールするには、(我々はまだeventletを使用している)問題を解決するように見えた
silentser

どうやらpsycogreenもあります:pypi.python.org/pypi/psycogreen/1.0(一度CONN_MAX_AGEをゼロに設定すると、システムにDB接続を確立するのに20ミリ秒かかるため、プールする必要がないので試していません)
ダレン

1
私たちが抱えていたのとまったく同じ問題にこの答えを出すのにグーグルで時間がかかりました。
アルパー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.