Sidekiq工人,nokogiri,持续记忆增长

时间:2018-01-27 02:11:11

标签: ruby-on-rails ruby memory cron sidekiq

我使用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不能在不保持内存束缚的情况下做到这一点。也许我只是不理解某些事情。

0 个答案:

没有答案