Sidekiq 内存使用量重置

5

我有一个使用Sidekiq进行后台处理的Rails应用程序。为了部署这个应用程序,我使用capistrano、ubuntu服务器和apache passenger。为了启动和重启Sidekiq,我使用capistrano-sidekiq gem。 我的问题是 - 当Sidekiq正在运行时,Sidekiq使用的内存(RAM)数量会增加。当Sidekiq完成所有进程(工作线程)时,它仍然占用大量的内存,并且不会重置。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
ubuntu    2035 67.6 45.4 3630724 1838232 ?     Sl   10:03 133:59 sidekiq 3.5.0 my_app [0 of 25 busy]     

如何使Sidekiq在工作完成后重置使用的内存?
(注:该问题涉及IT技术)

看起来您正在使用一些额外的中间件,这些中间件创建了没有过期日期的 Redis 键。 - Dmitry Polushkin
通过redis-cli info命令进行检查。 - Dmitry Polushkin
1
如何清理工作进程?或者如何确保它们都已经被清理了?或者如何检查是否有任何未被清理的工作进程?是否有类似于 Sidekiq.please.clean.all.workers.and.empty.my.memory 的命令?很抱歉问了这么多问题,但是我找不到任何相关信息。感谢您的帮助! - arthur-net
1
你的问题出在 worker 代码上,而不是 Sidekiq。你需要检查为什么 worker 代码会泄漏。这是一个更深入的话题,不适合在此讨论。 - Dmitry Polushkin
1
创建另一个问题或者使用关键词“调试Ruby中的内存泄漏”在谷歌上搜索。这是一个复杂的话题。 - Dmitry Polushkin
显示剩余9条评论
1个回答

12

Sidekiq使用线程来执行作业。线程和父进程共享相同的内存。因此,如果一个作业使用了大量的内存,Sidekiq进程的内存使用情况将会增加,并且不会被Ruby释放。

Resque使用另一种技术来执行每个作业,即在另一个进程中执行。因此,当作业完成时,作业的进程退出并释放内存。

防止Sidekiq进程使用过多内存的一种方式是使用Resque的分叉方法。

您可以将作业主方法执行在另一个进程中,并等待直到该新进程退出。

例如:

class Job
  include Process

  def perform
    pid = fork do
      # your code
    end
    waitpid(pid)
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接