Sidekiq 持续重启,如何排查?

您好,

我们已经运行了一个包含两个容器、支持多域名的 Discourse 服务器大约 4 年,托管了约 20 个域名。我们定期成功地进行了更新。然而,我们在 10 月初(大约 10 月 8-10 日开始)注意到,可能是在 Discourse 更新后,注册电子邮件未能发送。我们发现 sidekiq 任务没有运行,并且 Sidekiq 不断重启。

与我们执行的常规迁移唯一的区别是,这次我必须手动修改所有 Postgres 数据库以激活最新的 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 视图”似乎没有处理作业

  1. UI 显示一些关于 sidekiq 未正常运行的警告:“尚未执行更新检查。请确保 Sidekiq 正在运行。”

这是我尝试过的方法:

  • 重建(无错误)
  • 清空 Redis 队列(有效,Sidekiq 仪表板返回零,但任务仍未处理)
  • 检查数据容器中的 redis 版本(redis 版本:7.0.15)
  • 检查 Sidekiq 是否已暂停(未暂停)
  • 浏览 shared/web-only/log 中的日志,但找不到任何相关信息,不过 额外的提示 欢迎!
  • 尝试通过在 web_only.yml 中设置 DISCOURSE_LOG_SIDEKIQ: 1 来激活 Sidekiq 日志,然后执行 ./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 心跳测试失败,进程 ID 为 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'
1 个赞

谢谢!经过数小时的挖掘,我最好的猜测是 Sidekiq 在服务器承受压力(IO、CPU、RAM)时会重启,但我无法更清楚地确定(没有日志,没有 OOM)。

重启的频率从每分钟一次,到现在每 \sim 10 分钟一次(从而允许队列被处理),然后更少。