我在Heroku上有一个Rails 3.2 Ruby 1.9应用程序,工作正常。我升级到Ruby 2.1和Rails 4.1并很快开始出现内存错误:
错误R14(超出内存配额)
我在Heroku中设置了一个选项来显示内存使用情况。它显示了随着时间的推移越来越多的使用,但它不清楚为什么:
source = web.1 dyno = heroku.12 ... sample#memory_total = 514.44MB sample#memory_rss = 449.46MB sample#memory_cache = 0.52MB sample#memory_swap = 64.46MB sample#memory_pgpgin = 142709pages sample#memory_pgpgout = 27516pages
我查看了ObjectSpace,看看哪些类的实例最多,并获得了以下最佳结果:
[Module,1232],[MIME :: Type,1643],[Regexp,2334],[Hash,3002],[Class,3004],[Proc,3363],[RubyVM :: Env,3416] ,[Array,25436],[RubyVM :: InstructionSequence,26490],[String,127601]
似乎有很多字符串,但我不确定通常有多少字符串。我运行了ObjectSpace.garbage_collect
,它将字符串减少了47485个实例,并且还影响了许多其他类的实例计数,例如:T_ARRAY(-16308)和:T_NODE(-19508)。
上述意味着String对象是泄漏的来源吗?我该如何进一步诊断?
更新:
我安装了Oink gem以获取额外的内存信息,并在一块日志上运行它。但是,它只是将所有内容都显示为占用大量内存:
- 摘要 -
最糟糕的请求:
70748 KB,静态#home
70748 KB,部分#show
40664 KB,页面#show
它还显示创建的活动记录数:
- 摘要 -
最糟糕的请求:
1569年,静力学#home 829,节#show
817,页面#show
因此存在一般性内存泄漏,但我怎样才能找到它?
答案 0 :(得分:1)
尝试查看oink gem来调试开发环境中使用内存https://rubygems.org/gems/oink的位置。
另请查看您是否在db对象中创建了具有大量关联(has-many)db元素的数据库。他们可以为你消耗多少内存而惊喜
答案 1 :(得分:1)
删除new_relic gem 3.7.3有几天了,但随后又重新启动了内存问题。将Ruby从2.1更改为2.0修复了该问题。似乎Unicorn和Ruby 2.1相处得不好。