You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sidekiq收到SIGTERM信号时如何记录当前正在运行的作业?

Sidekiq内存溢出故障定位实现方案

问题背景

当Sidekiq worker出现内存溢出问题时,无法直接定位是哪项作业运行导致该故障,且需要排除作业启动时打日志这类常规方案。

实现思路

通过捕获SIGTERM、INT等进程终止信号,在信号触发回调中拉取当前正在运行的所有Sidekiq作业信息留存,用于后续故障排查,无需侵入作业本身的业务逻辑。

参考实现代码

Sidekiq.configure_server do |config|
  # 监听进程终止相关信号
  signals = %w[INT TERM]
  signals.each do |signal|
    old_handler = Signal.trap(signal) do
      running_jobs = []
      # 获取当前所有运行中的worker信息
      workers = Sidekiq::Workers.new
      workers.each do |_process_id, _thread_id, worker|
        # 原示例代码存在变量名笔误,已将work修正为worker
        running_jobs << worker
      end
      ## -> 此处自行实现信息留存逻辑 <- ##
      # 可将作业信息写入日志、监控系统等,示例:
      # running_jobs.each do |job|
      #   StatsTracker.count("#{job.dig('job', 'class')} being processed when shutdown")
      # end
      # 执行原有信号处理逻辑,避免覆盖Sidekiq默认的终止处理流程
      if old_handler.respond_to?(:call)
        old_handler.call
      else
        exit
      end
    end
  end
end

注意事项

  • 该方案仅会在进程收到终止信号时触发信息采集,对于OOM killer直接强制杀死进程的场景需要配合系统日志一同排查
  • 采集到的worker信息中包含作业类名、入参、入队时间等核心排查字段,可直接提取关键信息留存降低存储成本

内容的提问来源于stack exchange,提问作者John Bachir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:45:02