我使用Sidekiq工作人员来搜索一些网站,部分解析数据的过程涉及使用Nokogiri进行表格等。
然而,我一直有来自sidekiq的大量内存问题,不断扩展越来越多,永远不会释放内存。这些任务每隔几分钟就会运行一次,但内存会继续增长。我希望它能在作业完成后释放内存。
是否不建议将Sidekiq用于此类任务?想知道我可能需要寻找什么替代方案(如果有的话)。
这是我工人的极简化版本:
class SampleWorker
include Sidekiq::Worker
def perform
response = get_request("https://website.com")
@parsed_response = Nokogiri::HTML(response.body).xpath("//tbody/tr")
end
def get_request(url,headers="")
uri = URI.parse(url)
http = Net::HTTP::Persistent.new
response = http.request uri
http.shutdown
return response
end
end
显然会有更多代码在进行,但仅仅是为了测试目的,我将代码简化为上面的代码。在完成这项工作10次之后,ruby从使用3.7%的内存跳到12.2%。
不太确定为什么它不会在工作之间释放内存。也许我应该安排一个Linux cron作业来单独运行这个脚本而不让Sidekiq管理它?我的猜测是,如果它在Sidekiq之外运行,它可能会关闭并完成,而不是在没有运行/打开时使用任何内存。
修改
所以我只是跑过rails runner
命令,这似乎完全符合Sidekiq应该做的事情 - 它运行工作,完成并释放内存。它只是运行工人并关闭。不知道为什么sidekiq不能在不保持内存束缚的情况下做到这一点。也许我只是不理解某些事情。