我对Unicorn,Sidekiq和DB Pool大小的理解是否正确?

时间:2014-03-14 11:38:46

标签: ruby-on-rails postgresql ruby-on-rails-4 unicorn sidekiq

我有Unicorn,Sidekiq和Postgres设置。

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

我的数据库池大小为5。

考虑一下。 Sidekiq和Unicorn是它自己的过程。因此每个进程的数据库池大小为5.如果我的理解错误,请纠正我。

如果我有5个独角兽进程',则表示5 * 5 = 25个数据库连接

现在这是我有点困惑的部分,因为Sidekiq是多线程的。如果Sidekiq的并发度为5.并且db池大小也设置为5.这是否意味着在给定时间内有25个潜在的数据库连接?

这意味着,对于一个实例,我可以有50个db连接?

1 个答案:

答案 0 :(得分:18)

在Unicorn中,每个进程都建立自己的连接池,因此,如果您的数据库池设置为5,并且您有5个Unicorn工作程序,则最多可以有25个连接。但是,由于每个独角兽工作者一次只能处理一个连接,因此除非您的应用程序在内部使用线程,否则每个工作人员只会实际使用一个数据库连接。

在Sidekiq中,池中的连接是跨线程共享的,因此每个worker需要至少有一个连接可用。如果你的并发度为5,那么你的池需要至少为5。

如果池大小超过1意味着每个Unicorn工作者都可以访问它无法使用的连接,但它实际上不会打开连接,所以这并不重要。

您的应用所需的实际连接总数,除非您在应用程序代码中使用线程(并且他们不共享数据库连接),每个Sidekiq工作者一个加上每个Unicorn工作者一个。