Ich stoße auf Probleme mit Sidekiq-Mitarbeitern.Wie Debuggen Rails Verbindung Pool-Verwendung?
ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)
Ich verfolge Empfehlungen über ActiveRecord::ConnectionTimeoutError
und einen geeignet großen Verbindungspool verwenden.
Ich möchte herausfinden, ob ich den Verbindungspool erschöpft bin. Ich protokolliere size
und connections.length
von ActiveRecord::Base.connection_pool
, aber sie bleiben bei einer konstanten Größe = 100 connections.length = 5. Das deutet darauf hin, dass dies kein Problem mit Ressourcenlecks ist.
Mein MySQL-Server ist so konfiguriert, dass bis zu 400 gleichzeitige Verbindungen möglich sind.
beendet Mein Job wie dieser aufzublicken:
class MyJob < ActiveJob::Base
queue_as :default
rescue_from StandardError do |exception|
# clear connections on exception. Not sure if this is a good idea or not.
ActiveRecord::Base.clear_active_connections!
end
def perform()
logger.info "size"
logger.info ActiveRecord::Base.connection_pool.instance_eval { @size }
logger.info "connections"
logger.info ActiveRecord::Base.connection_pool.instance_eval { @connections }.length
# Ensure connections come from connection pool.
ActiveRecord::Base.connection_pool.with_connection do |conn|
# do stuff
end
end
end
Ist dies der richtige Weg zu diagnostizieren, was dies verursacht, ob es Ressource Hunger oder Leckage ist? Gibt es andere Techniken, die ich verwenden kann, um herauszufinden, warum dies geschieht?
Wie groß ist der Verbindungspool, der in Ihrer 'database.yml' definiert ist? Wie viele Sidekiq Worker-Threads verwenden Sie? – BoraMa
Pool ist definiert als 100, wie in connection_pool.size, 25 Arbeiter gezeigt. – Joe