Rails Sidekiq 内存泄漏

zengfengbo · 2019年12月17日 · 最后由 zengfengbo 回复于 2020年01月11日 · 4451 次阅读

ActiveJob 多跑几个后,sidekiq 内存飙高,然后内存占用 100%,宕机。

代码贴一下

优先查看用过 C、C++ 实现的 Gem,查查它们是否有内存泄漏风险;

Sidekiq / Ruby 本身是没有内存泄漏的,已经有大量且计算量巨大的 Sidekiq 案例在生产环境,并且跑很多年。

任务中是否有外部请求并大量超时

IChou 回复

@IChou 请问为什么外部请求超时会导致泄露内存?

实测两天,配置是用了 2 个进程,每个进程 4 线程。 每次跑完定时 Job 就内存飙升,重启之后又回复正常。 最初出现问题也是在当我把 sidekiq 从 1 进程 1 线程改为多进程多线程的时候。 后面还是在线程里面再开进程解决问题。代码如下: 来源出自某个网页,忘了链接了。

class ApplicationJob < ActiveJob::Base
  # added for sidekiq memory leak
  include Process
  around_perform do |_job, block|
    pid = fork do
      block.call
    end
    waitpid(pid)
  end
end
huacnlee 回复

怀疑是阿里云的 oss ruby gem 线程不安全。

IChou 回复

有外部请求,延时问题应该没有。

sidekiq-worker-killer

Rails 版本是多少?Rails 6 么? 如果是 Rails 6 的话,把 Rails 版本换成 5(比如:5.2), 试试还会不会出问题呢? 之前遇到过 Rails 6 貌似会出现这样的问题...

pengmeizhou 回复

Rails 5.2.4

Rei 回复

嗯,应该是我的问题。我目前用这个方法暂时规避了这个问题。

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