Ruby Ruby memory leak detection

Saito · 2013年03月25日 · 最后由 googya 回复于 2013年04月01日 · 6387 次阅读
本帖已被管理员设置为精华贴

Ruby memory leak detection

ObjectSpace object count

counts = Hash.new{ 0 }
ObjectSpace.each_object do |o|
  counts[o.class] += 1
end

# or
ObjectSpace.count_objects

Symbol count

# symbol will not be garbage collected
Symbol.all_symbols.count

Heap Dump

# gem i heap_dump
require 'heap_dump'
# will automatically run GC.start
HeapDump.dump

GC

# check if its just not be garbage collected
GC.start

TracePoint on system hook

# hook on native events
TracePoint.new { |tp|
  p [tp.lineno, tp.event, tp]
}.enable

def hello_world
  puts "hello"
end

hello_world

GDB & Dtrace(ruby 2.0)

# I'm not a c guy. so...

以上是我的一些笔记,结果我用了上面所有的方法,最终发现问题不是 memory leak..

orz.

求故事的背景,过程,以及结果。

http://huangzhimin.com/2012/12/16/how-i-find-out-a-memory-leak-in-rack-app/ 发现泄漏的方法差不多,也是 symbol 不会被 GC 自动回收

我推荐一篇神文章,也是查找 memory leak 的,不过更多的是在 C 层面:http://blog.nelhage.com/2013/03/tracking-an-eventmachine-leak/

这个评论也是我看完后的想法:

Very nice write up. It reads like a mystery novel. I kept trying to guess whodunit.

#1 楼 @lgn21st

背景:bug report: grack 有内存泄漏,clone 5G 的 repo 会消耗 5G 内存。

然后:我发现一个类似的 bug report 在我 fork 出来的 repo 里也出现了。

再然后:我开始怀疑是真的内存泄漏,所以做了一个测试: 最终发现内存稳定在一个恒定值,而不是无限的增长。在测试中我用到了上面的方法。

再然后:昨天晚上,@luikore google 到说 thin 跟 webrick 会 cache response, 然后我们俩就开了局 LOL ..

今天:顺藤摸瓜,发现在了确实是有这么个情况。

最终:Research Result

#4 楼 @Saito 难道不是你输出方式不对?

#5 楼 @bhuztez

The reason it doesn't work is because the control is not given back to EventMachine after each chunk is returned. So basically what happens is that each chunk of the body is buffered by EventMachine because the event loop doesn't have a chance to send the data between each Enumerator yield.

Thin 的作者这样回复的...

#6 楼 @Saito 就是你不对啊,EventMachine 里用屁个 rack 啊,更何况 git 协议就这么点东西...

#7 楼 @bhuztez 因为 Thin 是基于 EM 的..我没直接用 EM..

#8 楼 @Saito 那还是你不对...

#4 楼 @Saito 你也鲁阿撸?哪个区的?

#10 楼 @limkurn 美服,没有哪个区吧。前几天看见有 mac 版的就玩了一下..

#11 楼 @Saito 美服没分区 打美服太卡了

rails 挺耗内存

@Saito 另开一贴介绍一下 GDB 和 Dtrace 分析的经验吧

需要 登录 后方可回复, 如果你还没有账号请 注册新账号