加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails Reaper无法正常工作

发布时间:2020-12-17 03:10:24 所属栏目:百科 来源:网络整理
导读:根据API文档,rails reaper用于查找和恢复死线程的连接.收割机基于reaping_频率运行. 我遇到的情况是,当数据库连接数超过指定的限制并且有连接处于空闲状态但收割机没有重置这些连接.我尝试手动运行收割机,但它似乎没有任何影响. reaper = ActiveRecord::Conn
根据API文档,rails 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中收割机的错误还是不适合这样工作?如果是这样的话,如何选择编写自定义收割机来恢复死连接? pg gem用于连接postgres db.占用连接的查询是:

SHOW TRANSACTION ISOLATION LEVEL

Rails版本:4.2.3

pg宝石版:0.17.1

Postgres版本:9.4.6

Rails应用服务器:Puma

解决方法

先说几点:

>可能不是SHOW TRANSACTION ISOLATION LEVEL查询正在“吞噬”您的数据库连接. pg_stat_activity视图只显示活动或在您的情况下,在每个连接上执行的last query.因此,统计数据中更重要的信息就是打开了太多的连接.
> ConnectionPool::Reaper释放数据库连接但仅从dead threads释放,即那些已停止或意外终止的连接.但它不会影响连接活动或休眠线程. Reaper不适合你的事实IMO只是意味着那些线程可能正在睡觉,而不是死亡.

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

>您可能有太多线程同时检查了与db的连接. ConnectionPool通常为每个线程保留一个与db的连接,最多为database.yml中配置的池大小.因此,如果您的池大小相当大并且您有许多线程,则可以超过最大值.数据库连接.例如,puma创建到16 threads by default.
>每个rails进程定义自己的连接池.因此,例如,如果您的池大小定义为10并且您有10个rails进程,则与db的连接最多可以增加10 * 10 = 100个连接. Puma服务器允许运行multiple workers(这是单独的进程),因此你可能有太多的puma worker在运行.
>相同的逻辑适用于所有后台进程和线程.例如,Sidekiq默认情况下为后台作业创建最多25个线程.因此,如果您在代码中使用线程或在内部使用线程的任何gem,例如对于后台作业功能,您必须了解它们的精确设置,以便不超过最大连接数.
>您可能会遇到数据库连接泄漏.当使用preload_app(App preloading)时,Puma服务器需要一个特殊的设置,以便不泄漏数据库连接.这记录在例如here和here.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读