【发布时间】:2014-12-11 08:23:45
【问题描述】:
我正在运行一个多租户网站,我想减少为每个请求创建 PostgreSQL 连接的开销。 Django 的 CONN_MAX_AGE 允许这样做,但代价是创建大量到 PostgreSQL 的开放空闲连接(8 个工作人员 * 20 个线程 = 160 个连接)。每个连接 10MB,这会消耗大量内存。
主要目的是减少连接时间开销。 因此我的问题是:
- 我应该为这样的解决方案使用哪种设置? (PgBouncer?)
- 我可以在 Django 中使用“事务”池模式吗?
- 使用https://github.com/kennethreitz/django-postgrespool 代替 Django 的池会更好吗?
Django 1.6 设置:
DATABASES['default'] = {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
....
'PORT': '6432'
'OPTIONS': {'autocommit': True,},
'CONN_MAX_AGE': 300,
}
ATOMIC_REQUESTS = False # default
Postgres:
max_connections = 100
PgBouncer:
pool_mode = session # Can this be transaction?
max_client_conn = 400 # Should this match postgres max_connections?
default_pool_size = 20
reserve_pool_size = 5
【问题讨论】:
-
你能更新一下你最后做了什么吗?
-
max_client_conn- 不,它不应该与 postgres 设置匹配。pgbouncer应该接受那么多连接,当 pgbouncer 真实数据库连接被释放/未使用时,这些连接将在池中等待处理
标签: django connection-pooling pgbouncer