Sidekiq постоянно перезапускается: как устранить неполадки?

Здравствуйте,

Мы работаем с сервером Discourse, состоящим из двух контейнеров и поддерживающим несколько доменов, уже около 4 лет и хостим примерно 20 доменов. Мы регулярно выполняли обновления успешно. Однако в начале октября (примерно 8–10 октября), вероятно, после обновления Discourse, мы обнаружили, что письма для регистрации не отправляются. Мы заметили, что задача Sidekiq не выполняется, а Sidekiq постоянно перезапускается.

Единственное отличие от обычных миграций, которые мы выполняем, заключается в том, что на этот раз мне пришлось вручную изменить все базы данных PostgreSQL для активации последнего расширения vector; похоже, что скрипт обновления делает это только для основной базы данных discourse.

Симптомы:

  1. В логах видно, что Sidekiq перезапускается каждые несколько секунд

  1. Перезапуск сопровождается следующим сообщением об ошибке:
/var/www/discourse/lib/demon/sidekiq.rb:31:in `heartbeat_check'
config/unicorn.conf.rb:131:in `block (2 levels) in reload'
E, [2025-11-01T11:56:05.989645 #67] ERROR -- : reaped #<Process::Status: pid 6534 SIGKILL (signal 9)> worker=unknown
I, [2025-11-01T11:56:41.468169 #7038]  INFO -- : Loading Sidekiq in process id 7038
W, [2025-11-01T11:57:20.944092 #67]  WARN -- : Process would not terminate cleanly, force quitting. pid: 7038 Demon::Sidekiq
/var/www/discourse/lib/demon/base.rb:94:in `restart'
/var/www/discourse/lib/demon/sidekiq.rb:40:in `block in heartbeat_check'
/var/www/discourse/lib/demon/sidekiq.rb:31:in `each'
/var/www/discourse/lib/demon/sidekiq.rb:31:in `heartbeat_check'
  1. Представление «sidekiq view» не обрабатывает задачи

  1. В интерфейсе отображаются предупреждения о том, что Sidekiq работает некорректно: Проверка обновлений не была выполнена. Убедитесь, что Sidekiq запущен.

Вот что я попробовал:

  • пересборка (без ошибок)
  • очистка очереди Redis (работает, панель Sidekiq сбрасывается до нуля, но задачи всё равно не обрабатываются)
  • проверка версии Redis в контейнере данных (версия Redis: 7.0.15)
  • проверка, не приостановлен ли Sidekiq (не приостановлен)
  • просмотр логов в shared/web-only/log, но ничего существенного я не нашёл, хотя дополнительные подсказки будут очень кстати!
  • попытка активировать логи Sidekiq, установив DISCOURSE_LOG_SIDEKIQ: 1 в web_only.yml, а затем выполнив ./launcher stop web_only && ./launcher destroy web_only && ./launcher start web_only. В логах отображаются только сообщения об успехе, например:
{"hostname":"forum-web-only","pid":12961,"database":"chatonnade","job_id":null,"job_name":"Jobs::DiscourseAutomation::StalledWikiTracker","job_type":"scheduled","opts":"{}","status":"success","live_slots_start":1298445,"duration":0.04405494895763695,"sql_duration":0.03392060892656446,"sql_calls":1,"redis_duration":0,"redis_calls":0,"net_duration":0,"net_calls":0,"live_slots_finish":1299663,"live_slots":1218,"@timestamp":"2025-11-01T12:17:32.561+00:00"}

У меня заканчиваются идеи, что ещё можно сделать, чтобы найти причину проблемы. Где можно поискать содержательное сообщение об ошибке?

Заранее большое спасибо!

Я заметил то же самое, но это происходит не так часто. Всё работало исправно в течение многих лет, но в последнее время это случается примерно раз в месяц. Даже удвоил объём оперативной памяти на инстансе в прошлом году, чтобы успевать за обновлениями Discourse.

Сообщение

Тест сердечного ритма Sidekiq не удался для 2087, выполняется перезапуск

Стек вызовов

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-8.0.4/lib/active_support/broadcast_logger.rb:218:in `block in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-8.0.4/lib/active_support/broadcast_logger.rb:217:in `map'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-8.0.4/lib/active_support/broadcast_logger.rb:217:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-8.0.4/lib/active_support/broadcast_logger.rb:129:in `warn'
/var/www/discourse/lib/demon/sidekiq.rb:39:in `block in heartbeat_check'
/var/www/discourse/lib/demon/sidekiq.rb:31:in `each'
/var/www/discourse/lib/demon/sidekiq.rb:31:in `heartbeat_check'
config/unicorn.conf.rb:131:in `block (2 levels) in reload'

Спасибо! После часового поиска я склоняюсь к тому, что Sidekiq перезапускается, когда сервер испытывает нагрузку (по вводу-выводу, процессору или оперативной памяти), но точно установить причину не удалось (нет логов, нет OOM).

Частота перезапусков снизилась с одного раза в минуту до одного раза примерно каждые 10 минут (что позволило обрабатывать очередь), а затем стала ещё реже.