PG :: TRDeadlockDetected:ERROR:检测到死锁

Rai*_*ana 19 ruby postgresql ruby-on-rails idle-processing puma

我通过bundle exec pumactl -F config/puma.rb phased-restart什么工作正常重启8个美洲狮工人.现在我收到越来越多的postgres错误:

PG::TRDeadlockDetected: ERROR:  deadlock detected
Run Code Online (Sandbox Code Playgroud)

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

postgres: myapp myapp_production 127.0.0.1(59950) idle
postgres: myapp myapp_production 127.0.0.1(60141) idle
...
Run Code Online (Sandbox Code Playgroud)

当我跑步时,它们消失了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
Run Code Online (Sandbox Code Playgroud)

Rai*_*ana 23

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

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

ActiveRecord::Base.connection_pool.with_connection do
  # code
end
Run Code Online (Sandbox Code Playgroud)

ActiveRecord的with_connection方法产生从其池到块的数据库连接.块完成后,连接会自动检回池中,避免连接泄漏.

我希望这有助于你们中的一些人!