У меня проблемы с работниками Sidekiq.Как отладить использование пула соединений Rails?
ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)
Я следую рекомендации по использованию ActiveRecord::ConnectionTimeoutError
и соответствующим образом большого пула соединений.
Я хочу узнать, исчерпал ли я пул подключений. Я регистрирую size
и connections.length
от ActiveRecord::Base.connection_pool
, но они остаются с постоянным размером = 100 connections.length = 5. Это говорит о том, что это не проблема утечки ресурсов.
Мой сервер MySQL настроен на разрешение до 400 одновременных подключений.
My Job закончился выглядеть так:
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
Это правильный способ диагностировать то, что причиной этого, является ли это голодание ресурс или утечка? Существуют ли другие методы, которые я могу использовать, чтобы понять, почему это происходит?
Каков размер пула соединений, определенный в вашем 'database.yml'? Сколько боковых рабочих потоков вы используете? – BoraMa
Пул определяется как 100, как показано в connection_pool.size, 25 рабочих. – Joe