我的理解是Unicorn、Sidekiq和数据库连接池大小的正确性是什么?

19

我已经搭建好了Unicorn、Sidekiq和Postgres。

我正在尝试理解正确的配置方法,以便不会达到最大的数据库连接限制。在Opsworks中,m1.small Postgres RDS实例最多可以有121个连接。

我的数据库池大小为5。

考虑这一点。Sidekiq和Unicorn是各自的进程。因此每个进程的数据库池大小为5。如果我有5个Unicorn进程,那么就会有5*5=25个数据库连接。

现在这是我有点困惑的地方,因为Sidekiq是多线程的。如果Sidekiq的并发数为5,而且数据库池的大小也设置为5,那么在任何给定时间可能会有25个潜在的数据库连接?

这意味着,对于一个实例,我最多可以有50个数据库连接?

1个回答

24
在Unicorn中,每个进程都建立自己的连接池,因此如果您的db pool设置为5,并且您有5个Unicorn worker,则最多可以拥有25个连接。但是,由于每个Unicorn worker一次只能处理一个连接,所以除非您的应用程序在内部使用线程,否则每个worker将只实际使用一个db连接。
在Sidekiq中,池中的连接在线程之间共享,因此每个worker需要至少一个可用的连接。如果并发性为5,则您的池大小至少需要为5。
拥有大于1的池大小意味着每个Unicorn worker都可以访问它无法使用的连接,但它不会实际打开这些连接,因此这并不重要。
除非您的应用程序代码使用线程(它们不共享一个db连接),否则您的应用程序所需的实际连接总数为每个Sidekiq worker加上每个Unicorn worker的一个连接。

5个独角兽进程和一个DB连接池中的5个。不应该是25个数据库连接吗?根据https://dev59.com/D3DXa4cB1Zd3GeqP9jNY 上的答案。 - Christian Fazzini
哇,抱歉!我刚刚根据那个信息更新了我的答案。谢谢。 - Louis Simoneau
思考一下,如果Unicorn有5个工作进程,这意味着它可以同时处理5个Web请求。那么为什么它需要25个数据库连接呢?它难道不只需要5个吗? - Christian Fazzini
另一个好的观点。如果您在应用程序代码中使用线程并且它们不共享连接,则每个工作人员只需要多个。但是,您的池大小必须足够大以处理您的Sidekiq并发(因为线程共享池),并且比独角兽可以使用的更高并没有关系。我已更新和澄清了我的答案,并删除了一些与问题无关的多余信息。 - Louis Simoneau
是的,那个分析看起来大致正确。我在AWS Opsworks上运行了7个实例。AWS RDS报告35-40个(不知道其他5个是什么)数据库连接。 7 * 5 = 35。这解释了独角兽部分。由于此时没有作业运行,因此来自Sidekiq的数据库连接必须处于空闲/睡眠状态。 - Christian Fazzini
@LouisSimoneau 感谢你的清晰解释。我在理解这句话上遇到了困难:“如果池大小大于1,那么每个独角兽工作进程都可以访问它无法使用的连接,但它实际上不会打开这些连接,所以这并不重要。” 这意味着我可以将池设置为5,但是独角兽工作进程始终只会使用第一个打开的连接。我认为这不正确,但我猜你只是表达得不太清楚。你能否澄清一下?非常感谢;-)。谢谢 - awenkhh

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