很长一段时间以来,我一直收到 connection pool timeout
以及 2020-06-17T16:15:33.701Z pid=1132347 tid=goeqpzc8b WARN: PG::ConnectionBad: FATAL: sorry, too many clients already
使用sidekiq workers和postgres时出错。我试着理解这一切是如何简单地工作的,但无论我如何调整设置,似乎都无法摆脱这些错误。
现在,我的朋友 config/database.yml
文件使用这些设置作为其选项:
default: &default
adapter: postgresql
encoding: unicode
pool: 20
port: 25060
在我的 config/sidekiq.yml
文件,我还设置了以下选项:
development:
:concurrency: 20
production:
:concurrency: 20
:queues:
- default
根据我在digital ocean的数据库设置,我的后端服务器连接限制为22。
既然如此,为什么sidekiq作业会失败,而不是排队等待运行呢?我的每一个sidekiq工作人员都有代码来crud activerecord中的条目,但我不确定这在实际的sidekiq工作人员中有多重要。
据我所知,我对托管数据库的限制是最多22个连接,但我在 database.yml
以及 sidekiq.yml
文件低于限制,所以我不确定它是如何或为什么仍然失败的,而不是仅仅停留在队列中直到有空间为止。
在这种情况下,我是否应该使用建议的池和并发设置?sidekiq workers中的一些命令实际上监视特定记录中的更改,以查看它何时被更新,因此它会不断检查记录,然后在预期的信息出现在记录中后继续执行。
我正在寻找任何建议或澄清这一点。
1条答案
按热度按时间lyfkaqu11#
pg::connectionbad:fatal:抱歉,已经有太多客户端了
20和22之间的差距不会给你多少安全边际。例如,打开pgadmin4,然后启动一些监控连接(都绕过了连接池),如果池正试图被完全使用,则会超出限制。如果不能增加max\u连接,请尝试将池大小减少两个,以提高安全性。这可能会使另一个问题变得更糟,但从2个问题变成1个问题是一种进步。
既然如此,为什么sidekiq作业会失败,而不是排队等待运行呢?
我不是sidekiq的用户,但显然他们只愿意等这么长时间,而且这段时间已经超过了。或者至少,“连接池超时”不是由postgresql生成的消息,所以它来自其他地方;从措辞上看,游泳池经理显然是候选人。