art*_*net 4 ruby ruby-on-rails sidekiq
我有Rails应用程序,它使用Sidekiq进行后台处理.要部署此应用程序,我使用capistrano,ubuntu服务器和apache乘客.要启动并重新启动Sidekiq,我使用capistrano-sidekiq gem.我的问题是 - 当Sidekiq运行时,Sidekiq使用的内存量(RAM)正在增长.当Sidekiq完成所有进程(工作人员)时,它会保持大量RAM并且不会重置它.
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]
Run Code Online (Sandbox Code Playgroud)
如何让Sidekiq在工人完成工作后重置使用过的内存?
Sidekiq使用线程来执行作业.并且线程与父进程共享相同的内存.因此,如果一个作业使用大量内存,Sidekiq进程内存使用量将会增长并且不会被Ruby发布.
Resque使用另一种技术来执行另一个进程中的每个作业,因此当作业完成时,作业的进程退出并释放内存.
防止Sidekiq进程使用太多内存的一种方法是使用Resque的分叉方法.
您可以在另一个进程中执行您的job main方法,并等待该新进程退出
例如:
class Job
include Process
def perform
pid = fork do
# your code
end
waitpid(pid)
end
end
Run Code Online (Sandbox Code Playgroud)