【问题标题】:PG::TRDeadlockDetected: ERROR: deadlock detectedPG::TRDeadlockDetected:错误:检测到死锁
【发布时间】:2014-08-14 15:26:24
【问题描述】:

我正在通过bundle exec pumactl -F config/puma.rb phased-restart 重新启动 8 名 puma 工人,一切正常。现在我收到越来越多的 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

【问题讨论】:

  • 我没有使用 puma/ruby 的经验。从数据库方面来看,查看锁应该会有所帮助。 wiki.postgresql.org/wiki/Lock_Monitoring。尝试那里提供的最后一个查询。您将知道哪个事务阻塞了哪个事务。
  • 如果不重新启动,空闲连接会不断增加,直到应用因此错误而中断:PG::ConnectionBad (FATAL: remaining connection slots are reserved for non-replication superuser connections )

标签: ruby-on-rails ruby postgresql puma idle-processing


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      相关资源
      最近更新 更多