#ruby-on-rails #selenium-webdriver #heroku
Вопрос:
Я работаю над веб-сайтом, на котором выполняется множество запросов браузера на основе Chrome в облаке, которые включают загрузку файлов Excel/PDF и управление ими.
Каждую ночь звонит планировщик Heroku rake query:process_all_outstanding
, который определяет , какие запросы необходимы, и ставит каждый из них в очередь ProcessQueryWorker.perform_async()
.
Итак, теперь у нас есть сотни или тысячи задач, стоящих в очереди для работников Heroku.
Каждая задача вызывает метод, который запускает экземпляр Chrome:
require 'webdrivers/chromedriver'
require 'selenium-webdriver'
require 'fileutils'
Selenium::WebDriver.logger.level = :debug
# Heroku needs this location
if Rails.env == 'production'
Selenium::WebDriver::Chrome.path='/app/.apt/usr/bin/google-chrome'
end
profile = Selenium::WebDriver::Chrome::Profile.new
# Custom directory for each user to minimize overlap
path = FileOperations::DOWNLOAD_DIR "/#{self.user_id}/#{self.tracker.agency}/#{self.id}"
profile['browser.download.dir'] = path
profile['browser.download.folderList'] = 2
profile['browser.helperApps.neverAsk.saveToDisk'] = ('application/pdf;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel;text/csv;text/html');
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
# Fixes for 'unknown error: session deleted because of page crash'
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-sandbox')
options.add_preference(:download, directory_upgrade: true,
prompt_for_download: false,
default_directory: path)
driver = Selenium::WebDriver.for :chrome, options: options
driver.manage.window.size = Selenium::WebDriver::Dimension.new(1400, 1600)
driver.manage.timeouts.implicit_wait = 10
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
return driver, wait
Каждый отчет делает свое дело и завершается звонком driver.quit
.
Проблема
Даже после запуска всего 20 отчетов о работнике стандарта 2X я начинаю видеть повышенную частоту ошибок, например:
unknown error: net::ERR_CONNECTION_REFUSED
app[worker.1]: (Session info: headless chrome=94.0.4606.61)
Selenium::WebDriver::Error::UnknownError
… и упоминания о Error R14 (Memory quota exceeded)
.
Эти проблемы временно исчезнут, если я heroku restart
снова запущу rake query:process_all_outstanding
.
Каков самый простой способ убедиться, что память полностью очищается после каждого ProcessQueryWorker.perform_async()
, чтобы эти проблемы прекратились?