delayed_job перестает работать через некоторое время в производстве - PullRequest
12 голосов
/ 02 декабря 2010

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

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

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

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

Ответы [ 2 ]

12 голосов
/ 02 декабря 2010

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

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

Ведение журнала

Идет вход в систему delayed_jobпоэтому, если работник умирает без вывода сообщения об ошибке, это обычно происходит из-за того, что он не выдает исключение (например, Segfault) или что-то внешнее убивает процесс.экземпляры заданий, и до сих пор это очень успешно обеспечивало выполнение заданий. Шаги по запуску 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 голосов
/ 18 июня 2014

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

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

при условии, что вы используете delayed_job с Rails4, вы должны:

1.install god gem: $ gem install god

2. иметь этот файл сценария:

# 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

на:

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

см. Мой личный блог: http://siwei.me/blog/posts/using-delayed-job-with-god

...