我正在通过bundle exec pumactl -F config/puma.rb phased-restart重新启动8名美洲狮工人,一切都很好。现在我收到越来越多的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发布于 2014-11-14 09:23:04
--我可能已经找到了一个解决问题的方法:--我在控制器(自定义中间件)之外有一些查询,这似乎导致了这个问题。
如果在控制器之外有查询(ActiveMailer也可能导致此问题),请将代码放在ActiveRecord::Base.connection_pool.with_connection块中:
ActiveRecord::Base.connection_pool.with_connection do
# code
endActiveRecord的with_connection方法生成从其池到块的数据库连接。当块完成时,连接将自动签回池中,从而避免连接泄漏。
希望这对你们中的一些人有帮助!
发布于 2014-07-16 02:50:10
看起来,这可能是由于数据库连接没有在服务器关机时关闭。https://github.com/puma/puma/issues/59很多人都在使用ActiveRecord::ConnectionAdapters::ConnectionManagement来处理这个问题,或者您可以使用Puma的重新启动钩子来滚动自己的重新启动。
https://stackoverflow.com/questions/24385407
复制相似问题