当前位置: 首页 > 知识库问答 >
问题:

使用Django的CONN\u MAX\u AGE的pgbouncer的理想设置

那利
2023-03-14

我正在运行一个multi-tennant网站,在那里我想减少每个请求创建PostgreSQL连接的开销。Django的CONN\u MAX\u AGE允许这样做,但代价是创建大量到PostgreSQL的开放空闲连接(8个工作线程*20个线程=160个连接)。由于每个连接10MB,这会消耗大量内存

主要目的是减少连接时间开销。因此,我的问题是:

  • 对于这样的解决方案,我应该使用哪种设置?(PgBouncher?)
  • 我可以在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

博士后:

max_connections = 100

保镖:

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

共有1个答案

欧镜
2023-03-14

这是我使用的设置。

pgbounker与Gunicorn、芹菜等在同一台机器上运行。

pgbouncer.ini:

[databases]
<dbname> = host=<dbhost> port=<dbport> dbname=<dbname>

[pgbouncer]
: your app will need filesystem permissions to this unix socket
unix_socket_dir = /var/run/postgresql
; you'll need to configure this file with username/password pairs you plan on
; connecting with.
auth_file = /etc/pgbouncer/userlist.txt

; "session" resulted in atrocious performance for us. I think
; "statement" prevents transactions from working.
pool_mode = transaction

; you'll probably want to change default_pool_size. take the max number of
; connections for your postgresql server, and divide that by the number of
; pgbouncer instances that will be conecting to it, then subtract a few
; connections so you can still connect to PG as an admin if something goes wrong.
; you may then need to adjust min_pool_size and reserve_pool_size accordingly.
default_pool_size = 50
min_pool_size = 10
reserve_pool_size = 10
reserve_pool_timeout = 2
; I was using gunicorn + eventlet, which is why this is so high. It
; needs to be high enough to accommodate all the persistent connections we're
; going to allow from Django & other apps.
max_client_conn = 1000
...

/etc/pgbouncer/userlist.txt:

"<dbuser>" "<dbpassword>"

Djangosettings.py:

...
DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgresql_psycopg2',
        'NAME': '<dbname>',
        'USER': '<dbuser>',
        'PASSWORD': '<dbpassword>',
        'HOST': '/var/run/postgresql',
        'PORT': '',
        'CONN_MAX_AGE': None,  # Set to None for persistent connections
    }
}
...

如果我没记错的话,您基本上可以有任意数量的“持久”连接到pgbouner,因为当Django完成服务器连接时,pgbouner会将服务器连接释放回池中(只要您使用事务语句forpool_mode)。当Django尝试重用其持久连接时,pgbouncher会负责等待与Postgres的可用连接。

 类似资料:
  • pgbouncer 是 PostgreSQL 的轻量的连接池,支持三种模式。 Session pooling/会话连接池 最礼貌的方法。在客户端连接的时候,在它的连接生命期内,会给它赋予一个服务器连接。在客户端断开的时候,服务器连接会放回到连接池中。 Transaction pooling/事务连接池 服务器连接只有在一个事务里的时候才赋予客户端。在 PgBouncer 注意到事务结束的时候,服务

  • 问题内容: 在过去的几周内,我一直在尝试使用番石榴的MapMaker查找理想的缓存实现。 根据我所学的知识,我的下一个尝试将弃用软值,以使用maximumSize和expireAfterAccess: 哪里 但是,我仍然要解决的一个问题是,一旦它们用完了,即使对象很容易到达,此实现也将逐出对象。这可能会导致环境中漂浮着具有相同UID的多个对象,而这是我所不希望的(我相信我试图实现的目标称为规范化)

  • 本文向大家介绍Python Django中的STATIC_URL 设置和使用方式,包括了Python Django中的STATIC_URL 设置和使用方式的使用技巧和注意事项,需要的朋友参考一下 使用Django静态设置时,遇到很多问题,经过艰苦的Baidu, stack overflow, Django原档阅读,终于把静态图片给搞出来了。特记录下来。 关键的概念:Django中,静态资源的存放通

  • 问题内容: 我正在尝试使用Eclipse设置Django。现在,我正在创建一个新的Pydev Django项目,并收到“找不到Django”错误消息。 当我尝试通过命令行验证Django是否集成时,它可以工作。 我刚好有两个python安装,分别是2.7和3.2,而且我确定我正在使用Eclipse(和命令行)中的2.7。我究竟做错了什么? 问题答案: 如果在安装django之前添加了python解

  • 我希望产品化并部署我的Kafka Connect应用程序。然而,我对任务有两个问题。最大值设置,这是必需的,非常重要,但具体设置该值的具体内容很模糊。 如果我有一个包含n个分区的主题,我希望从中使用数据并将其写入某个接收器(在我的情况下,我正在写入S3),那么我应该设置什么任务。最大值到?我应该把它设置为n吗?我应该把它设置为2n吗?直觉上,我似乎想将值设置为n,这就是我一直在做的。 如果我更改我

  • 问题内容: 我想稍微远离PHP,学习Python。为了使用Python进行Web开发,我需要一个框架来帮助模板和其他事情。 我有一台非生产服务器,用于测试所有Web开发内容。这是一个运行MariaDB而不是常见的MySQL服务器软件包的Debian 7.1 LAMP堆栈。 昨天我安装了Django并创建了我的第一个项目firstweb。我尚未更改任何设置。 这是我的第一个大困惑。在教程中,我跟随那