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
相关产品推荐
相关产品推荐

