关于Rails上的ruby:sidekiq内存使用情况重置

sidekiq memory usage reset

我有使用Sidekiq进行后台处理的Rails应用程序。要部署此应用程序,我使用capistrano,ubuntu服务器和apache passenger。要启动和重新启动Sidekiq,我使用capistrano-sidekiq gem。
我的问题是-Sidekiq运行时,Sidekiq使用的内存(RAM)数量正在增长。而且,当Sidekiq完成所有进程(工作人员)时,它会保持大量的RAM并且不进行重置。

1
2
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重置使用的内存?


Sidekiq使用线程执行作业。
并且线程与父进程共享相同的内存。
因此,如果一项作业占用大量内存,Sidekiq进程的内存使用量将会增长,并且不会被Ruby释放。

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

防止Sidekiq进程使用过多内存的一种方法是使用Resque的派生方法。

您可以在另一个进程中执行您的job main方法,然后等待该新进程退出

例如:

1
2
3
4
5
6
7
8
9
10
class Job
  include Process

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