我正在通过 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/