Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails内存管理_Ruby On Rails_Ruby_Memory Management_Memory Leaks_Carrierwave - Fatal编程技术网

Ruby on rails RubyonRails内存管理

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中的内存系统不会将空闲内

我正在实现一个RubyonRails服务器(Ruby2.2.1和Rails4.1.10),我面临一些内存问题,其中服务器进程(puma)可能需要500MB甚至更多的内存。主要是当我将大文件上传到服务器时,我得到了这种价值。我用的是carrierwave

我的问题与ruby管理系统和垃圾收集有关。看到我的服务器专用于嵌入式系统,我真的需要限制或控制内存,我的进程是从系统中获取的

有没有一种方法可以看到哪些对象(及其大小)仍然存在并且不应该存在? 如果内存是碎片化的,ruby中的内存系统不会将空闲内存返回给系统,这对吗? 请帮我弄清楚当我的内存超过150MB空闲时会发生什么


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不太熟悉,但这款宝石应该可以做到:

我不知道这对你来说是否是一个有效的解决方案,但关于你的问题,这似乎是你最好的选择

希望能有帮助:)