【发布时间】:2015-01-09 01:52:36
【问题描述】:
我正在运行 7 个 sidekiq 进程(货币设置为 40)和一个乘客网络服务器,连接到一个 postgres 数据库。 Rails pool 设置为 100,而 postgres max_connections 设置也是默认的 100。
我刚刚添加了一个新的作业类,其中每个作业都发出多个 postgres 请求,我开始在许多 sidekiq 作业上出现此错误,有时在我的网络服务器上:PG::ConnectionBad: FATAL: remaining connection slots are reserved for non-replication superuser connections
我尝试将 postgres max_connections 增加到 200,但仍然出现错误。然后我尝试将 activerecord 池设置减少到 25(每个进程 25 个连接 = 200 个总连接),我想我可能会开始收到 DB 连接超时错误,但至少它会停止“没有剩余连接插槽”错误。
但我仍然收到 remaining connection slots are reserved 错误。
处理这个问题的更聪明的方法可能是将我不断重复使用的重要 postgres 数据加载到 redis 中,然后从 redis 访问它 - 这显然与 sidekiq 一起玩得更好更快。但即使我这样做了,我也想了解这里的 postgres 连接发生了什么:
- 我可能会泄漏连接吗,我应该这样做吗? 在 sidekiq 工作中进行管理?
(见Releasing ActiveRecord connection before the end of a Sidekiq job)
- 我是否应该研究更模糊的问题,例如锁定/争用问题 还是 PG 驱动程序的线程问题?
(请参阅https://github.com/mperham/sidekiq/issues/594。我认为我使用 ActiveRecord 非常简单,对于 Rails 应用程序没有太多晦涩或异常的逻辑......)
- 或者我只是不明白 ActiveRecord 池的设置 和 postgres max_connection 设置一起工作...?
【问题讨论】:
标签: ruby-on-rails postgresql activerecord sidekiq