我有Rails应用程序,它使用Sidekiq作为后台进程。要部署这个应用程序,我使用capistrano、ubuntu服务器和apache passenger。要启动和重新启动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] 如何让Sidekiq在工人完成工作后重置已用内存?
发布于 2015-12-25 18:47:30
Sidekiq使用线程来执行作业。线程与父进程共享相同的内存。因此,如果一个作业使用了大量内存,那么Sidekiq进程的内存使用量将会增长,并且不会被Ruby释放。
Resque使用另一种技术,它在另一个进程中执行每个作业,因此当作业完成时,作业的进程退出并释放内存。
防止Sidekiq进程使用过多内存的一种方法是使用Resque的forking方法。
您可以让您的作业主方法在另一个进程中执行,并等待该新进程退出
例如:
class Job
include Process
def perform
pid = fork do
# your code
end
waitpid(pid)
end
endhttps://stackoverflow.com/questions/32374919
复制相似问题