[英]PG::TRDeadlockDetected: ERROR: deadlock detected
我通过bundle exec pumactl -F config/puma.rb phased-restart
重新启动8个puma bundle exec pumactl -F config/puma.rb phased-restart
什么工作正常。 现在我收到越来越多的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
我可能已经找到了我的问题的解决方案:我在我的控制器(自定义中间件)之外有一些查询,这似乎导致了问题。
如果您在控制器之外有查询(ActiveMailer也可能导致此问题),请将您的代码放在ActiveRecord::Base.connection_pool.with_connection
块中:
ActiveRecord::Base.connection_pool.with_connection do
# code
end
ActiveRecord的with_connection方法产生从其池到块的数据库连接。 块完成后,连接会自动检回池中,避免连接泄漏。
我希望这有助于你们中的一些人!
看起来这可能是由于数据库连接未在服务器关闭时关闭。 https://github.com/puma/puma/issues/59该问题中的很多人都使用ActiveRecord :: ConnectionAdapters :: ConnectionManagement来处理这个问题,或者你可以通过使用Puma的on_restart钩子来自己动手 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.