【问题标题】:Sidekiq is not releasing the memory after finishing the jobSidekiq 完成工作后没有释放内存
【发布时间】:2018-08-07 15:59:39
【问题描述】:

我在使用 Sidekiq 时遇到了一些奇怪的问题,我在使用 Sidekiq 的后台运行了一些繁重的工作。但即使在 Sidekiq 完成工作后,它仍然保留着内存。可能是什么原因? 版本

ruby : 2.2.4
rails : 4.2.7
sidekiq : 3.5.4

我也附上了内存日志。 即使我已经检查了link,但它无济于事。我什至还手动启动了 GC。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 sidekiq


    【解决方案1】:

    我的理解是 Ruby MRI 不会将内存释放回操作系统。如果您的 Sidekiq 作业消耗大量内存,即使这些对象被垃圾回收,内存也只会被释放回 Ruby,而不是返回给操作系统。您应该尝试找到一种方法来使您的 Sidekiq 作业消耗更少的内存,并假设您的工作人员最终将分配您最消耗内存的作业所需的最大内存量。

    【讨论】:

    • 我不认为是这种情况,好像我杀死了 Sidekiq 进程它正在释放内存,如果我遗漏了什么,请纠正我。
    • @SabyasachiGhosh:嗯,就是这样。如果你杀死 sidekiq 进程,你会杀死持有分配内存的 VM 实例,因此它会被释放回操作系统。
    【解决方案2】:

    您好,我们也遇到了同样的问题。我对此进行了很多研究。吉姆说right。处理资源的是 Ruby MRI。实际上,您的 sidekiq 工作人员很重,或者他们正在执行繁重的操作,我猜它也在进行更多的对象分配。他们需要更多的资源 ruby​​ 从操作系统中获取资源,然后将其用于在 sidekiq 中执行的操作。它不会向操作系统释放内存。它使用相同的内存空间并重用它来为其他对象提供资源。

    要避免此问题,您必须牢记的是优化您的代码。

    • 如果您要执行多个繁重的操作并且可以将它们分开,则为此使用单独的工作人员。
    • 您可以批量运行 fetch 查询以减少服务器上的负载。
    • 在必要时使用数组操作。

    您也可以在作业结束后运行 GC.start 强制运行垃圾收集器以释放内存。

    当你杀死一个 sidekiq 进程时,它会将内存释放给操作系统,因为进程正在由 ruby​​ 运行并且你杀死了它,所以最终 ruby​​ 会释放内存给操作系统。

    我希望这会有所帮助。 您必须优化您的代码,这与mperham 给出的建议相同。

    【讨论】:

    • 我按照你的建议做了一切,唯一我不能改变的是繁重的后台工作,我们需要那个繁重的工作。
    • 你能把繁重的工作分成小的独立工作吗?
    • 大部分是分成一个较小的,但所有这些较小的工作组合起来是巨大的。
    • @SabyasachiGhosh,您找到解决此问题的方法了吗?我也面临同样的问题
    猜你喜欢
    • 2013-09-29
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2021-08-05
    • 2012-07-04
    • 1970-01-01
    • 2018-12-02
    • 2012-10-26
    相关资源
    最近更新 更多