Celery使用eventlet worker线程时,数据库连接过多

3

我有两个使用eventlet池化的celery workers,配置如下:

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

我在使用默认设置为100的max.连接的PostgreSQL上运行。
从我在网上阅读的内容来看,我认为线程池中的工作线程应该共享同一个DB连接。然而,我的线程似乎想要为每个线程创建一个连接,这就是错误发生的原因。
有什么建议吗?
谢谢!

你是否为Psycopg打了猴子补丁?http://eventlet.net/doc/patching.html#monkeypatching-the-standard-library - Anentropic
修补psycopg也无法解决这个问题。 - temoto
@Leb 你针对这个问题有什么解决方案吗? - tausif
1个回答

1
Django有(或曾经有过)空闲的DB连接重用,以避免为每个请求创建新连接的开销。在这种情况下,空闲重用不相关。
Django从未有过限制DB连接池。(如果错误请纠正)
考虑整体设计:
- 您需要同时执行多少任务?(实际数字通常不是10的幂) - 您的数据库可以承受多少来自此应用程序的同时连接? - 您需要放置人工瓶颈(池),还是需要增加限制并使用可用的硬件?
考虑使用外部[Postgresql连接池](方括号中的谷歌术语)或在应用程序中包含一个连接池。

谢谢@temoto,我进行了快速搜索并将尝试使用PgBouncer的事务池。由于我的应用程序处于Beta阶段,所以我还没有很好地估计并发任务和同时连接的数量,但我知道它们是大批量而不是小的稳定流。两个快速问题:1. 通过人工瓶颈(池),您是否指的是PostgreSQL连接池?2. 增加限制将是增加PostgreSQL中的最大连接数并更新相关设置以支持此类增加吗? - Leb
池指任何池,包括应用程序中的pgbouncer或20行代码池。增加限制将找到当前瓶颈限制并增加它,包括postgresql配置、应用程序、操作系统内核和其他任何因素。 - temoto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接