代码之家  ›  专栏  ›  技术社区  ›  Sabyasachi Ghosh

Sidekiq在完成任务后不会释放内存

  •  1
  • Sabyasachi Ghosh  · 技术社区  · 8 年前

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

    ruby : 2.2.4
    rails : 4.2.7
    sidekiq : 3.5.4
    

    enter image description here 我还附上了内存日志。 即使我已经检查了 link 但没办法。我甚至还手动启动了GC。

    2 回复  |  直到 8 年前
        1
  •  5
  •   Jim Ryan    8 年前

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

        2
  •  2
  •   Gagan Gupta    8 年前

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

    为了避免这个问题,你必须记住的是优化你的代码。

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

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

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

    我希望这能有帮助。 你必须优化你的代码,这是由 mperham .