Celery eventlet 工作线程使用过多的数据库连接
Celery eventlet worker threads using too many database connections
我有 2 个 celery worker,它们通过 eventlet 进行池化,配置如下:
celery multi start w1 w2 -A proj -l info --time-limit=600 -P eventlet -c 1000
当 运行 一次超过 100 个任务时,我遇到错误:
OperationalError: FATAL: remaining connection slots are reserved for
non-replication superuser connections
我 运行 在 PostgreSQL 上最多。连接数设置为默认值 100。
根据我在网上阅读的内容,我认为池中的工作线程将共享相同的数据库连接。但是,我的似乎尝试为每个线程创建一个连接,这就是发生错误的原因。
有什么想法吗?
谢谢!
Django 有(或曾有?)空闲 数据库连接重用以避免为每个请求创建新连接的开销。闲置重用与这种情况无关。
Django 从未限制 数据库连接池。 (如有错误请指正)
考虑整体设计:
- 您需要并发执行多少个任务? (实数通常不是 10 的好次方)
- 您的数据库可以维持多少来自此应用程序的同时连接?
- 您是否需要设置人为瓶颈(池)或是否需要增加限制并使用可用硬件?
考虑使用外部 [Postgresql 连接池](google 方括号中的术语)或在您的应用程序中的某处包含一个。
我有 2 个 celery worker,它们通过 eventlet 进行池化,配置如下:
celery multi start w1 w2 -A proj -l info --time-limit=600 -P eventlet -c 1000
当 运行 一次超过 100 个任务时,我遇到错误:
OperationalError: FATAL: remaining connection slots are reserved for non-replication superuser connections
我 运行 在 PostgreSQL 上最多。连接数设置为默认值 100。
根据我在网上阅读的内容,我认为池中的工作线程将共享相同的数据库连接。但是,我的似乎尝试为每个线程创建一个连接,这就是发生错误的原因。
有什么想法吗?
谢谢!
Django 有(或曾有?)空闲 数据库连接重用以避免为每个请求创建新连接的开销。闲置重用与这种情况无关。
Django 从未限制 数据库连接池。 (如有错误请指正)
考虑整体设计:
- 您需要并发执行多少个任务? (实数通常不是 10 的好次方)
- 您的数据库可以维持多少来自此应用程序的同时连接?
- 您是否需要设置人为瓶颈(池)或是否需要增加限制并使用可用硬件?
考虑使用外部 [Postgresql 连接池](google 方括号中的术语)或在您的应用程序中的某处包含一个。