Rails Sidekiq 后台任务失效

lukefan · 2015年09月30日 · 最后由 lukefan 回复于 2015年11月15日 · 3488 次阅读

使用

RAILS_ENV=production bundle exec sidekiq -d -C config/sidekiq.yml

将 sidekiq 启动起来,过一段时间,就发现 sidekiq 死掉了,所有任务都堆在 proecessed 里面,不动了。 只能通过 crontab 去定时监测,发现死掉了,重新启动。

有什么方法可以避免这个问题吗?

一开始没有-d 参数的时候,没有这种问题。

这个时候我更想看看sidekiq.log

#1 楼 @zoker 看过了,最后没有什么东西。就是上一个任务结束了。

看 log 看看是否有异常,Crash 总是有原因的

不会是有代码调用了 exit 了吧

#4 楼 @jimrokliu 没有,如果不是-d 启动在后台,可以稳定的跑几周时间。

可以用 monit 加个监控先观察。sidekiq 的退出事件加个代码,收集一下运行的状态。

#6 楼 @jimrokliu 我现在是定期检查,如果发现有计划任务过期,或执行任务堆积,就判定 sidekiq 退出了,就再起一次。

@lukefan 除了 sidekiq.log,log 目录其它日志也看看。之前遇到 Redis 故障造成 Sidekiq 暂停执行。

现在感觉,就是内存太少了。我把并行任务数设为 10,大概有一半的几率会崩掉。设为 20,每次都崩。最后改成了 5,天下太平了。

#9 楼 @lukefan 一直都跑的 20,好好的啊

#10 楼 @zoker 你有多少内存?

一般这种情况基本都是内存不足

外部请求没有加超时是导致 sidekiq frozen 的最常见原因

https://github.com/mperham/sidekiq/wiki/Problems-and-Troubleshooting#user-content-frozen-processes

解决方法如下

  1. 使用纯 ruby 写的 dns 解析器
  2. 给所有的外部请求加超时

http://mednoter.com/frozen-worker.html

我现在遇到的最多的是内存分配失败。 特别是 carrierwave 中调用 minimagick 进行图片处理的时候。

可以把 sidekiq 多配置几个进程

#16 楼 @qilinzou 总内存太少,再怎么折腾也是白费啊。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号