我的堆栈包括 django (1.4.3)、psycopg2 (0.0.3) 和 postgres (9.1)。此外,我正在使用 psycogreen.gevent.patch_psycopg,因为我正在使用 gunicorn 和 gevent 为我的 django 提供服务。
一切似乎都很开心,但我得到了很多(约 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()
两个问题:
- 所有这些打开的连接都好吗?对我来说,这似乎浪费了很多内存。
- 这与 gevent 或 psycogreen 有关吗?我没有在任何 greenlets 中明确使用数据库。
我已经阅读了很多关于从 django 保持打开状态的数据库连接,但这一切似乎都来自大约 2 年前,当时 django 中仍然存在一个打开的错误(https://code.djangoproject.com/ticket/9964#comment: 51 )。
非常感谢任何见解。