gpt4 book ai didi

ruby-on-rails - Rails Reaper 不工作

转载 作者:行者123 更新时间:2023-11-29 11:28:51 24 4
gpt4 key购买 nike

根据 API 文档,rails reaper 旨在从死线程中查找和恢复连接。reaper 是根据 reaping_ 频率运行的。

我遇到过这样的情况:数据库连接数超过指定限制,并且有连接处于空闲状态,但收割者没有重置这些连接。我尝试手动运行收割机,但似乎没有任何效果。

reaper = ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper.new(ActiveRecord::Base.connection, 10)
reaper.run

它没有任何效果已被验证使用

ActiveRecord::Base.connection.execute("SELECT * FROM pg_stat_activity WHERE pid <> pg_backend_pid()")
PgHero.total_connections

这是 ActiveRecord 中 reaper 的错误还是它不应该像这样工作?如果是这种情况,如何选择编写自定义收割器来恢复死连接? pg gem 用于连接到 postgres 数据库。消耗连接的查询是:

SHOW TRANSACTION ISOLATION LEVEL

rails 版本:4.2.3

pg gem 版本:0.17.1

Postgres 版本:9.4.6

Rails 应用服务器:Puma

最佳答案

首先注意几点:

  • 可能不是 SHOW TRANSACTION ISOLATION LEVEL 查询正在“耗尽”您的数据库连接。 pg_stat_activity View 仅显示事件,或者在您的情况下,last query 在每个连接上执行。因此,统计信息中更重要的信息就是打开的连接太多。

  • ConnectionPool::Reaper释放数据库连接,但 仅来自 dead threads ,即那些停止或意外终止的。但它不影响事件连接或休眠线程。在我看来,Reaper 对您不起作用这一事实仅意味着这些线程可能正在休眠,而不是死亡。

现在,超过最大值的原因有很多。数据库服务器上允许的连接:

  • 您可能太多线程同时检查到数据库的连接ConnectionPool 通常为每个线程保留一个到数据库的连接,最大为 database.yml 中配置的 pool 大小。所以如果你的池大小相当大并且你有很多线程,你可以超过最大值。数据库连接。例如,puma 最多创建 16 threads by default .

  • 每个 rails 进程都定义了自己的连接池。因此,例如,如果您的池大小定义为 10,并且您有 10 个 rails 进程,则与 db 的连接可以增加到 10 * 10 = 100 连接。 Puma 服务器允许运行 multiple workers (它们是单独的进程),因此您可能有太多 puma worker 正在运行。

  • 同样的逻辑适用于所有后台进程和线程。例如,Sidekiq 默认为后台作业创建最多 25 个线程。因此,如果您在代码中使用线程或在内部使用线程的任何 gem,例如对于后台作业功能,您必须了解它们的精确设置,以免超过最大连接数。

  • 您可能会遇到数据库连接泄漏。当使用 preload_app(应用程序预加载)时,Puma 服务器需要进行特殊设置,以免数据库连接泄漏。这是记录在案的,例如herehere .

关于ruby-on-rails - Rails Reaper 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36619094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com