私のスタックには、django (1.4.3)、psycopg2 (0.0.3)、および postgres (9.1) が含まれています。さらに、gunicorn と gevent でジャンゴを提供しているため、psycogreen.gevent.patch_psycopg を使用しています。
すべてが満足しているように見えますが、多くの (~40) データベース接続が開いています。django データベースのセットアップで「autocommit」を True に設定するまで、それらはすべて「トランザクションでアイドル状態」でした。現在、それらはすべて「アイドル」です。
これは私の pg_top 出力のサンプルです。
last pid: 22043; load avg: 0.09, 0.05, 0.05; up 6+21:49:58 16:21:08
45 processes: 45 sleeping
CPU states: 3.0% user, 0.9% nice, 0.2% system, 96.0% idle, 0.0% iowait
Memory: 871M used, 130M free, 32M buffers, 530M cached
Swap: 10M used, 246M free, 2192K cached
PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND
10035 postgres 39 19 51M 6668K sleep 0:00 0.00% 0.00% postgres: user production 127.0.0.1(41309) idle
16783 postgres 39 19 51M 6652K sleep 0:00 0.00% 0.00% postgres: user production 127.0.0.1(42426) idle
10034 postgres 39 19 51M 6640K sleep 0:00 0.00% 0.00% postgres: user production 127.0.0.1(41308) idle
12690 postgres 39 19 51M 6604K sleep 0:00 0.00% 0.00% postgres: user staging 127.0.0.1(36931) idle
10293 postgres 39 19 51M 6704K sleep 0:00 0.00% 0.00% postgres: user staging 127.0.0.1(36931) idle
...そして、上記のような36行。
これは、psycogreen 用の私の gunicorn.conf のセットアップです。
def post_fork(server, worker):
from psycogreen.gevent import patch_psycopg
patch_psycopg()
2 つの質問:
- これらの開いている接続はすべて問題ありませんか? 私には多くの無駄なメモリ使用のように見えます。
- これは gevent または psycogreen に関連していますか? グリーンレット内でデータベースを明示的に使用していません。
django から開いたままのデータベース接続について多くのことを読みましたが、それはすべて、django にまだ開いているバグがあった約 2 年前のもののようです ( https://code.djangoproject.com/ticket/9964#comment: 51)。
どんな洞察も大歓迎です。