我在运行一个多租户网站,在这里我想减少每个请求创建一个PostgreSQL连接的开销。Django的CONN_MAX_AGE可以实现这一点,但会产生很多空闲的 PostgreSQL 连接(8个工作进程 * 20个线程 = 160个连接)。每个连接占用10MB内存,这将消耗大量内存。
主要目的是减少连接时间开销。 因此,我的问题如下:
主要目的是减少连接时间开销。 因此,我的问题如下:
- 我应该使用哪种设置来解决这个问题?(例如 PgBouncer)
- 我能否在 Django 中使用“事务”池模式?
- 是否最好使用像https://github.com/kennethreitz/django-postgrespool这样的东西代替Django的池化?
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 真正的数据库连接被释放/未使用时。 - smido