Подтвердить что ты не робот

Delayed_job перестает работать через некоторое время в производстве

В процессе производства наш delayed_job процесс умирает по какой-то причине. Я не уверен, если он рушится или будет убит операционной системой или что. Я не вижу ошибок в файле delayed_job.log.

Что я могу сделать, чтобы устранить эту проблему? Я думал об установке monit, чтобы отслеживать его, но это только скажет мне, когда он умрет. На самом деле это не скажет мне, почему он умер.

Есть ли способ сделать его более болтливым для файла журнала, поэтому я могу понять, почему он может умереть?

Любые другие предложения?

4b9b3361

Ответ 1

Я столкнулся с двумя причинами, по которым delayed_job терпит неудачу. Первый - фактические segfaults, когда люди использовали libxml в разветвленных процессах (это появилось в списке рассылки некоторое время назад).

Вторая проблема, связанная с версией демонов 1.1.0, на которую полагается delayed_job, имеет проблему (https://github.com/collectiveidea/delayed_job/issues#issue/81), это можно легко обойти, используя 1.0.10, что и есть мой собственный Gemfile.

Вход

Выполняется запись в delayed_job, поэтому, если рабочий умирает, не печатая ошибку, это обычно потому, что он не бросает исключение (например, Segfault) или что-то внешнее, убивает процесс.

Мониторинг

Я использую bluepill для мониторинга моих замедленных экземпляров заданий, и до сих пор это было очень успешным в обеспечении того, чтобы задания оставались в рабочем состоянии. Шаги для запуска bluepill для приложения довольно просты

Добавьте драгоценный камень bluepill в свой Gemfile:

 # Monitoring
  gem 'i18n' # Not sure why but it complained I didn't have it
  gem 'bluepill'

Я создал файл конфигурации bluepill:

app_home = "/home/mi/production"
workers = 5
Bluepill.application("mi_delayed_job", :log_file => "#{app_home}/shared/log/bluepill.log") do |app|
  (0...workers).each do |i|
    app.process("delayed_job.#{i}") do |process|
      process.working_dir = "#{app_home}/current"

      process.start_grace_time    = 10.seconds
      process.stop_grace_time     = 10.seconds
      process.restart_grace_time  = 10.seconds

      process.start_command = "cd #{app_home}/current && RAILS_ENV=production ruby script/delayed_job start -i #{i}"
      process.stop_command  = "cd #{app_home}/current && RAILS_ENV=production ruby script/delayed_job stop -i #{i}"

      process.pid_file = "#{app_home}/shared/pids/delayed_job.#{i}.pid"
      process.uid = "mi"
      process.gid = "mi"
    end
  end
end

Затем в моем файле развертывания capistrano я просто добавил:

# Bluepill related tasks
after "deploy:update", "bluepill:quit", "bluepill:start"
namespace :bluepill do
  desc "Stop processes that bluepill is monitoring and quit bluepill"
  task :quit, :roles => [:app] do
    run "cd #{current_path} && bundle exec bluepill --no-privileged stop"
    run "cd #{current_path} && bundle exec bluepill --no-privileged quit"
  end

  desc "Load bluepill configuration and start it"
  task :start, :roles => [:app] do
    run "cd #{current_path} && bundle exec bluepill --no-privileged load /home/mi/production/current/config/delayed_job.bluepill"
  end

  desc "Prints bluepills monitored processes statuses"
  task :status, :roles => [:app] do
    run "cd #{current_path} && bundle exec bluepill --no-privileged status"
  end
end

Надеюсь, это поможет немного.

Ответ 2

Наиболее распространенный случай, который я встретил для этой проблемы, вызван проблемами базы данных (ошибки подключения mysql или так далее). по умолчанию нет журналов.

поэтому я предлагаю вам использовать god для управления вашей задержкой_job (вы можете увидеть его файл журнала!).

Предполагая, что вы используете delayed_job с Rails4, вам необходимо:

1. установить божественный камень: бог установки $gem

2.Вставьте этот файл script:

# filename: cache_cleaner.god
RAILS_ROOT = '/sg552/workspace/m-api-cache-cleaner'
God.watch do |w| 
  w.name = 'cache_cleaner'
  w.dir = RAILS_ROOT
  w.start = "cd #{RAILS_ROOT} && RAILS_ENV=production bundle exec bin/delayed_job -n 5 start"
  w.stop = "cd #{RAILS_ROOT} && RAILS_ENV=production bundle exec bin/delayed_job stop"
  w.restart = "cd #{RAILS_ROOT} && RAILS_ENV=production bundle exec bin/delayed_job -n 5 restart"
  w.log = "#{RAILS_ROOT}/log/cache_cleaner_stdout.log"
  w.pid_file = File.join(RAILS_ROOT, "log/delayed_job.total.pid")
  # you should NEVER use this config settings: 
  # w.keepalive   (always comment it out! ) 
end

3. Чтобы начать/остановить/перезапустить delayed_jobs, измените команду:

$ bundle exec bin/delayed_job -n 3 start

to:

$ god -c cache_cleaner.god -D  
$ god start/stop/restart cache_cleaner

обратитесь к моему личному блогу: http://siwei.me/blog/posts/using-delayed-job-with-god