У меня есть приложение rails, размещенное на NGINX и Puma. Примерно каждые 10 часов приложение становится непригодным для использования. Всякий раз, когда пользователь пытается подключиться, отображается следующее сообщение об ошибке:
Error during failsafe response: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)
Это продолжается до тех пор, пока приложение не будет перезапущено.
Я читал, что это связано с тем, что пул соединений с базой данных заполнен, поэтому в приложении rails должны создаваться потоки, которые не закрывают свое соединение с базой данных по завершении. Насколько мне известно, в коде приложения есть только одно место, где используются потоки: один блок использует модуль Ruby Timeout, но он не обращается к базе данных.
Следуя этому руководству https://devcenter.heroku.com/articles/concurrency-and-database-connections (на самом деле я не использую Heroku) Я установил размер пула соединений с базой данных равным 5 со следующим файлом конфигурации:
#config/initializers/database_connection.rb
Rails.application.config.after_initialize do
ActiveRecord::Base.connection_pool.disconnect!
ActiveSupport.on_load(:active_record) do
config = ActiveRecord::Base.configurations[Rails.env] ||
Rails.application.config.database_configuration[Rails.env]
config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
config['pool'] = ENV['MAX_THREADS'] || 5
ActiveRecord::Base.establish_connection(config)
end
конец
Сайт размещен с использованием Rails 4.0.0. Я читал, что на самом деле это может быть проблема Rails 4.0.0, и что это было исправлено в более поздних версиях, но я не уверен в этом. ConnectionTimeoutError на Heroku с Postgres
- Есть ли способ отслеживать количество активных подключений к базе данных в пуле подключений? Это значительно упростило бы отладку.
- Является ли использование модуля Timeout в коде приложения Rails причиной этой проблемы?
- Вероятно, это проблема Rails 4.0.0, а не проблема с моим приложением?
Приложение rails работает в производственной среде. Я могу предоставить больше информации о моей конфигурации Puma, NGINX, если это необходимо.
airbrake
и/или с использованиемcurrent_user
вapplication_controller.rb
. Кто-нибудь еще имеет эту ошибку, используя гем airbrake или используя current_user в application_controller.rb? - person Catfish   schedule 12.01.2015