ruby-on-rails - PG::TRDeadlockDetected:错误:检测到死锁

标签 ruby-on-rails ruby postgresql puma idle-processing

我正在通过 bundle exec pumactl -F config/puma.rb phased-restart 重新启动 8 个 puma worker,效果很好。现在我收到越来越多的 postgres 错误:

PG::TRDeadlockDetected: ERROR:  deadlock detected

我发现大约有 50 个空闲的 postgres 进程在运行:

postgres: myapp myapp_production 127.0.0.1(59950) idle
postgres: myapp myapp_production 127.0.0.1(60141) idle
...

当我运行 bundle exec pumactl -F config/puma.rb stop 时它们消失了。 使用 bundle exec pumactl -F config/puma.rb start 启动应用程序后,我正好得到 16 个空闲进程。 (我认为八个太多了。)

如何更好地管理这些流程?感谢您的帮助!


更新

我的 puma.rb:

environment 'production'
daemonize true

pidfile 'tmp/pids/puma.pid'
state_path 'tmp/pids/puma.state'

threads 0, 1
bind 'tcp://0.0.0.0:3010'

workers 8

quiet

最佳答案

我可能已经找到了我的问题的解决方案:我在我的 Controller (自定义中间件)之外有一些查询,这似乎是导致问题的原因。

如果您在 Controller 之外有查询(ActiveMailer 也可能导致此问题),请将您的代码放在 ActiveRecord::Base.connection_pool.with_connection block 中:

ActiveRecord::Base.connection_pool.with_connection do
  # code
end

ActiveRecord 的 with_connection 方法产生一个从它的池到 block 的数据库连接。当 block 完成时,连接会自动签回池中,避免连接泄漏。

希望对大家有所帮助!

关于ruby-on-rails - PG::TRDeadlockDetected:错误:检测到死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24385407/

相关文章:

sql - 如何在 rails 中添加条件 where 子句

ruby - 在ruby中按整数递增字符串

database - 拒绝连接到 PostgreSQL 服务器

ruby-on-rails - 为什么验证会覆盖旧限制

ruby-on-rails - Rails - 检查父对象是否被销毁并调用 destroy on dependents

ruby - 无法检索包含临时文件的散列的第一个元素

ruby - 如何在 Rakefile 中上传 IronWorker 的工作人员?

SQL合并行

python - "settings.DATABASES is improperly configured"与 django 1.6

ruby-on-rails - production.rb 中的 force_ssl - 如何在 Controller 中覆盖为 http