Tag: 内存

应用程序控制器中的变量是否会导致Rails中的内存泄漏?

我在Rails上有一个应用程序,我在Heroku上运行(每天查看1 000页的页面浏览量)。 自上周推出以来,我一直在经历频繁的应用程序崩溃。 看看New Relic,似乎Dynos的内存使用量不断增加,而不会降低内存使用率。 基本上,它会在几个小时内累积,然后以请求超时结束,这似乎很可能。 因此,我认为应用程序崩溃的问题是由于内存泄漏。 我的应用程序(presenttips.com)是一个礼品网站,我有“随机礼物”,“当天的礼物”和“横幅”等function。 这些我在应用程序控制器中加载如下: before_filter :global_setup def global_setup # Create random gift rand_gift = [] rand_gift < 1) #=> Accepted @random_gift = rand_gift[0][rand(rand_gift[0].size) – 1] rand_gift = nil @nbr_of_active_gifts = (Gift.where(:gift_status_id => 1).count / 100 ).round * 100 @toplist = Gift.where(:gift_status_id => 1).order(“week_click DESC”).limit(20) @banners = Banner.where(“first_date = ‘” + […]

Rails app中的内存不断增加

我最近推出了一个新的Ruby on Rails应用程序,它在开发模式下运行良好。 在发布之后,我一直在体验正在使用的内存不断增加: 更新 :当从New Relic获取此屏幕转储(下面的那个)时。 我已经安排了每小时重启web dyno(两个web dynos中的一个)。 因此,它没有达到500Mb的崩溃水平,它实际上得到了一点sig锯模式。 尽管如此,问题根本没有得到解决,只有一些症状。 你可以看到早上不是那么忙,但下午更忙。 我在11.30上传了一个小细节,即使它在统计数据中显示也不会影响问题。 还可以注意到,即使图形显示AVG存储器,也是MIN存储器继续增加。 即使图形似乎在图形中暂时下降,最小内存保持不变或增加。 MIN记忆永不减少! 该应用程序将(没有dyno重新启动)内存增加,直到它达到Heroku的最高级别,并且应用程序崩溃执行过期类型的错误。 我不是一个优秀的程序员,但我之前做过一些应用程序而没有这类问题。 执行故障排除 答:我认为问题在于application_controller中的before_filter( 应用程序控制器中的变量会导致Rails中的内存泄漏吗? )但这不是问题。 B.我安装了oink但它没有给出任何结果(根本)。 它创建了一个oink.log,但是当我运行“heroku run oink -m log / oink.log”时,无论什么门槛都没有给出任何结果。 C.我尝试过bleak_house但它已被弃用,无法安装 D.我用谷歌搜索并阅读了主题中的大多数文章,但我不是更聪明。 E.我很想测试memprof,但是我无法安装它(我有Ruby 1.9x并且不知道如何将它降级到1.8x) 我的问题: Q1。 我真正想知道的是每个请求增加的变量的名称,或者至少哪个控制器使用最多的内存。 Q2。 一个控制器如下面的代码会增加内存吗? related_feed_categories = [] @gift.tags.each do |tag| tag.category_connections.each do |cc| related_feed_categories << cc.category_from_feed end end (对不起,因为某种原因,所以不会重新格式化代码以便于阅读)。 […]

Rails与内存数据库

我可以将rails设置为使用带有MEMORY的mysql作为数据库引擎吗? 我从来没有重新启动mysql,并且经常重建数据库我宁愿让它快速。 让内存db运行测试也会很好。 编辑:我应该指定这只是开发/测试,而不是生产。

使用oink gem和heroku

我已经安装了oink gem来监控rails应用程序的内存使用情况。 为了查看oink报告,我需要在终端中运行此命令: oink –threshold=75 /log/* 当我在我的机器上运行它时,它会显示开发环境的报告。 问题是我更感兴趣的是看到我的生产环境的报告。 我的应用程序托管在heroku上,有没有办法为heroku的生产环境运行oink的终端命令? 谢谢

跟踪heroku上的应用程序内存使用情况

我正在heroku上托管一个rails应用程序。 有没有办法可以跟踪正在运行的dynos的内存使用情况? 谢谢

在Ruby on Rails中,如何在会话之间将对象保留在内存中

我正在尝试构建一些东西(最终是一个gem,但现在是一个应用程序),其工作方式如下。 例如,假设DB记录是狗的品种。 每个品种都有一个Dog父类和一个子类。 直到运行时才知道实际品种。 当服务器开始时,它将从DB加载记录并根据记录实例化类的实例,例如,我可能有两个小猎犬和贵宾犬。 当有人来到服务器时,他们可能想要访问其中一个狗实例。 为什么不动态创建实例? 在我的例子中,“狗”基本上是包含算法和数据的类。 该算法没有改变,数据很少改变(大约几天),但是算法本身的执行,其使用数据和传递的一些动态数据,例如时间戳,将被访问多次。 如果必须重新创建对象的实例并且每次只是为了在下一个请求上再次执行请求而加载数据(请求不会更改对象的状态),那将是愚蠢的。 当我可以重复使用同一个对象时,我会创建并销毁多个对象。 将它保留在会话中是没有意义的,因为想要一个贵宾犬的人不需要在她的会话对象中有beagles信息; 这是无关紧要的(并且没有规模)。 如何将这些对象保存在内存中? 我基本上想要一个查找表来保存实例。 在Java中,我将使用某种类型的hashmap或数组创建一个单例,它位于内存中。 在rails中我通过在lib文件夹中创建一个单例类来尝试这个。 我认为 – 我可能不理解这一点 – 当会话消失时,实例(事实上它是单身人士没有实际意义)正在丢失。 我找到的最接近的答案是http://www.ruby-forum.com/topic/129372 ,它基本上将所有内容放在课程领域和方法中。 不知怎的,这似乎不对。 TIA! 另外:我来自Java。 在Java中,我只是创建一个位于堆上或者可能位于JNDI树中的对象,当HTTP请求进入时,它们将由一个servlet或EJB或一些每个请求项处理,然后可以访问持久对象。 我似乎无法在rails中找到相应的东西。

Rails是否加载了所有已安装的gem?

当Rails加载时,它是否会加载系统上安装的所有gem? 我在服务器上安装了47个gem,包括所有具有多个版本的各种Railsgem。 但是,Rails和应用程序使用的所有gem都被冻结到应用程序中。 是否所有这些gem都被加载了,这会导致应用程序运行速度变慢或占用更多内存(注意我的服务器上运行了两个应用程序实例,一个实时,一个作为测试环境)? 如果Rails正在加载所有已安装的gem,有没有办法让它只加载冻结的gem而不是其他gem?

这段代码是否在Ruby中创建了循环内存引用?

我有以下假设代码: class User ‘token’, :secret => ‘secret’) # I want to get the user’s posts in thread #12345. user.oauth_consumer.get_posts_in_thread(12345) 我想知道这是否创建了一个循环内存引用,其中user有oauth_consumer的引用,而oauth_consumer有一个对user的引用,因此无法进行垃圾回收? 或者底层GC实现(REE 1.8.7)是否处理​​这种情况?

如何在Ruby中处理巨大的JSON文件作为流,而不占用所有内存?

我在Ruby中处理一个巨大的JSON文件时遇到了麻烦。 我正在寻找的是一种逐个处理它的方法,而不会在内存中保留太多数据。 我认为yajl-ruby gem会做这项工作,但它会消耗我所有的记忆。 我也看过Yajl :: FFI和JSON:Streamgem,但有明确说明: 对于较大的文档,我们可以使用IO对象将其流式传输到解析器中。 我们仍然需要解析对象的空间,但文档本身永远不会完全读入内存。 这是我对Yajl的所作所为: file_stream = File.open(file, “r”) json = Yajl::Parser.parse(file_stream) json.each do |entry| entry.do_something end file_stream.close 内存使用量持续增加,直到进程被终止。 我不明白为什么Yajl会在内存中保留已处理的条目。 我可以以某种方式释放它们,还是我误解了Yajl解析器的function? 如果无法使用Yajl完成:有没有办法在Ruby中通过任何库?

如何在Ruby中迭代内存中的zip文件

我正在写一个unit testing,其中一个正在返回一个zip文件,我想检查这个zip文件的内容,从中获取一些值,并将值传递给下一个测试。 我正在使用Rack Test,所以我知道我的zip文件的内容在last_response.body 。 我查看了RubyZip的文档,但似乎总是期待一个文件。 由于我正在运行unit testing,我更喜欢在内存中完成所有操作,以免污染任何带有测试zip文件的文件夹,如果可能的话。