完成作业后,Sidekiq不会释放内存

时间:2018-08-06 09:34:51

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

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

ruby : 2.2.4
rails : 4.2.7
sidekiq : 3.5.4

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

嗨,我们也面临着同样的问题。我做了很多研究。吉姆说right。处理资源的是Ruby MRI。实际上,您的sidekiq工人很重,或者他们正在执行繁重的操作,我想它也在分配更多的对象。他们增加了所需的资源,ruby从OS中获取资源,然后将其用于在sidekiq中执行的操作。它不会将内存释放到操作系统。它使用相同的内存空间,然后重复使用以为其他对象提供资源。

要避免出现此问题,您需要牢记的是优化代码。

  • 如果您要执行多个繁重的操作,并且可以将其划分开,请为此使用单独的工作程序。
  • 您可以批量运行获取查询,以减少服务器上的负载。
  • 在必要时使用数组操作。

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

当您终止sidekiq进程时,由于进程是由ruby运行的,因此它会将内存释放到OS中,并且您杀死了它,因此ruby最终将向OS释放内存。

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