22

我正在通过正常工作重新启动 8 名美洲狮工人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
4

2 回答 2

27

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

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

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

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

我希望这对你们中的一些人有所帮助!

于 2014-11-14T09:23:04.323 回答
1

看起来这可能是由于数据库连接在服务器关闭时没有关闭。https://github.com/puma/puma/issues/59这个问题中的很多人都在使用 ActiveRecord::ConnectionAdapters::ConnectionManagement 来处理这个问题,或者你可以使用 Puma 的on_restart钩子来滚动你自己的。

于 2014-07-16T02:50:10.137 回答