Ruby on rails RubyonRails内存管理
我正在实现一个RubyonRails服务器(Ruby2.2.1和Rails4.1.10),我面临一些内存问题,其中服务器进程(puma)可能需要500MB甚至更多的内存。主要是当我将大文件上传到服务器时,我得到了这种价值。我用的是carrierwave 我的问题与ruby管理系统和垃圾收集有关。看到我的服务器专用于嵌入式系统,我真的需要限制或控制内存,我的进程是从系统中获取的 有没有一种方法可以看到哪些对象(及其大小)仍然存在并且不应该存在? 如果内存是碎片化的,ruby中的内存系统不会将空闲内存返回给系统,这对吗? 请帮我弄清楚当我的内存超过150MB空闲时会发生什么Ruby on rails RubyonRails内存管理,ruby-on-rails,ruby,memory-management,memory-leaks,carrierwave,Ruby On Rails,Ruby,Memory Management,Memory Leaks,Carrierwave,我正在实现一个RubyonRails服务器(Ruby2.2.1和Rails4.1.10),我面临一些内存问题,其中服务器进程(puma)可能需要500MB甚至更多的内存。主要是当我将大文件上传到服务器时,我得到了这种价值。我用的是carrierwave 我的问题与ruby管理系统和垃圾收集有关。看到我的服务器专用于嵌入式系统,我真的需要限制或控制内存,我的进程是从系统中获取的 有没有一种方法可以看到哪些对象(及其大小)仍然存在并且不应该存在? 如果内存是碎片化的,ruby中的内存系统不会将空闲内
Stéph在阅读了大量关于该问题的帖子后,似乎真正的原因来自Ruby GC,自版本2.1.x以来,Ruby GC消耗了大量服务器内存并导致大量服务器交换 为了解决这些性能问题,我只需将
RUBY\u GC\u HEAP\u OLDOBJECT\u LIMIT\u FACTOR
设置为1.25左右的值。您可以使用该设置为您的环境找到最佳价值
仅供参考,我的应用程序在Heroku Cedar 14上运行Ruby 2.1.5,运行起来很有魅力
希望有帮助:)我想我的问题与GC启动的方式无关,因为如果我要求手动垃圾收集GC.start,我就无法收回内存。也许我的某个地方有内存泄漏,但我想找到一种方法来跟踪它 事实上,在您的案例中,CarrierWave gem本身似乎是您问题的根源。
这个gem似乎使用整个文件来播放它,而不是块。。。因此,当您上传大文件时,您可以轻松达到服务器的内存限制
这篇文章似乎证实了我的观点:
<> P>我可以建议你在S3上直接使用上传来保存你的服务器在Amazon服务器上直接在后台进行上传处理。
我对carrierwave不太熟悉,但这款宝石应该可以做到:
我不知道这对你来说是否是一个有效的解决方案,但关于你的问题,这似乎是你最好的选择
希望能有帮助:)