Проблемы с памятью при выполнении многих задач rake на Heroku

#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() , чтобы эти проблемы прекратились?