Kum*_*rsh 5 postgresql activerecord ruby-on-rails ruby-on-rails-4
根据API文档,rails reaper用于查找和恢复死线程的连接.收割机基于reaping_频率运行.
我遇到的情况是,当数据库连接数超过指定的限制并且有连接处于空闲状态但收割机没有重置这些连接.我尝试手动运行收割机,但它似乎没有任何影响.
reaper = ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper.new(ActiveRecord::Base.connection, 10)
reaper.run
Run Code Online (Sandbox Code Playgroud)
使用它验证它没有任何影响
ActiveRecord::Base.connection.execute("SELECT * FROM pg_stat_activity WHERE pid <> pg_backend_pid()")
PgHero.total_connections
Run Code Online (Sandbox Code Playgroud)
这是ActiveRecord中收割机的错误还是不适合这样工作?如果是这样的话,如何选择编写自定义收割机来恢复死连接?pg gem用于连接postgres db.占用连接的查询是:
显示交易隔离级别
Rails版本:4.2.3
pg宝石版:0.17.1
Postgres版本:9.4.6
Rails应用服务器:Puma
先说几点:
可能不是SHOW TRANSACTION ISOLATION LEVEL查询"吞噬"您的数据库连接.该pg_stat_activity视图只显示活动或在您的情况下,在每个连接上执行的最后一个查询.因此,统计数据中更重要的信息就是打开了太多的连接.
该ConnectionPool::Reaper的FreeS DB连接,但只从死线程,即那些停止或意外终止.但它不会影响连接活动或休眠线程.Reaper不适合你的事实IMO只是意味着那些线程可能正在睡觉,而不是死亡.
现在,超出最大值可能有很多原因.允许数据库服务器上的连接:
您可能有太多线程同时检查了与db的连接.在ConnectionPool通常保留每个线程一个连接到数据库,直到pool在配置的大小database.yml.因此,如果您的池大小相当大并且您有许多线程,则可以超过最大值.数据库连接.例如,puma 默认创建多达16个线程.
每个rails进程都定义了自己的连接池.因此,如果您的池大小定义为10并且您有10个rails进程,则与db的连接可以提升到10 * 10 = 100连接.Puma服务器允许运行多个worker(这是单独的进程),因此你可能有太多的puma worker在运行.
相同的逻辑适用于所有后台进程和线程.例如,Sidekiq默认情况下为后台作业创建最多25个线程.因此,如果您在代码中使用线程或在内部使用线程的任何gem,例如对于后台作业功能,您必须了解它们的精确设置,以便不超过最大连接数.
您可能会遇到数据库连接泄漏.Puma服务器在使用preload_app(App预加载)时需要特殊设置,以便不泄漏数据库连接.这在此处和此处记录.
Din*_*ini -1
请将以下代码添加到config/deploy.rb
deploy.task :restart, :roles => :app do
run "touch #{current_path}/tmp/restart.txt"
end
Run Code Online (Sandbox Code Playgroud)
情况2如果使用Capistrano(只需删除脚本/进程目录):
默认情况下,Capistrano 尝试启动一个运行 reaper 脚本的新 Rails 进程。您应该自定义默认行为。
假设您使用 Passenger (mod_rails) 运行 Rails 应用程序,请安装以下 Capistrano + Passenger (mod_rails) 配方,Capistrano 将在部署时正常重启您的 Passenger 实例。
| 归档时间: |
|
| 查看次数: |
1010 次 |
| 最近记录: |