ruby on rails - app - PG:: TRDeadlockDetected: ERROR: interbloqueo detectado
heroku app login (2)
Parece que esto puede deberse a que las conexiones de la base de datos no se cierran al cerrar el servidor. https://github.com/puma/puma/issues/59 Mucha gente en ese problema está usando ActiveRecord :: ConnectionAdapters :: ConnectionManagement para manejar esto, o puede hacer su propio rollo utilizando el gancho on_restart de Puma.
Estoy reiniciando 8 trabajadores de puma a través del bundle exec pumactl -F config/puma.rb phased-restart
lo que funciona bien. Ahora estoy recibiendo más y más errores postgres:
PG::TRDeadlockDetected: ERROR: deadlock detected
Encontré alrededor de 50 de procesos postgres inactivos ejecutándose:
postgres: myapp myapp_production 127.0.0.1(59950) idle
postgres: myapp myapp_production 127.0.0.1(60141) idle
...
Desaparecen cuando estoy ejecutando bundle exec pumactl -F config/puma.rb stop
. Después de iniciar la aplicación con el bundle exec pumactl -F config/puma.rb start
, obtengo exactamente 16 procesos inactivos. (Ocho demasiados en mi opinión.)
¿Cómo puedo gestionar mejor estos procesos? ¡Gracias por tu ayuda!
Actualizar
Mi 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
Podría haber encontrado una solución a mi pregunta: tuve algunas consultas fuera de mis controladores (middleware personalizado), que parecen haber causado el problema.
Si tiene consultas fuera de los controladores (ActiveMailer también podría causar este problema), coloque su código en un bloque ActiveRecord::Base.connection_pool.with_connection
:
ActiveRecord::Base.connection_pool.with_connection do
# code
end
El método with_connection de ActiveRecord produce una conexión de base de datos de su grupo al bloque. Cuando el bloque finaliza, la conexión se verifica automáticamente en el grupo, evitando las fugas de conexión.
¡Espero que esto ayude a algunos de ustedes!