Ruby 2.0中的垃圾收集器调优

33

我想知道在Ruby 2.0的新GC实现中,是否仍然需要使用1.9.x的GC调优。如果是这样,那么在新版本中是否有任何新的配置选项可以设置?

我说的是以下设置:

RUBY_HEAP_MIN_SLOTS=600000 
RUBY_GC_MALLOC_LIMIT=59000000
RUBY_HEAP_FREE_MIN=100000
2个回答

50
关于这些GC调优参数,存在相当多的混淆。REE(Ruby 1.8.7版本的分支)首先引入了自己的参数,后来 Ruby(从1.9.2开始)引入了自己类似的参数。Ruby 1.9.3通过环境变量使它们可定制化,Ruby 2.1.0增加了更多功能。 这篇博客文章详细介绍了MRI中的垃圾回收以及所有调优变量的含义。
下面是每个Ruby版本的所有调优变量的完整列表: REE 来源
  • RUBY_HEAP_MIN_SLOTS
  • RUBY_HEAP_SLOTS_INCREMENT
  • RUBY_HEAP_SLOTS_GROWTH_FACTOR
  • RUBY_GC_MALLOC_LIMIT
  • RUBY_HEAP_FREE_MIN
Ruby 1.9.2 来源 来源 (硬编码,但可通过这个补丁的环境变量进行定制)
  • GC_MALLOC_LIMIT
  • HEAP_MIN_SLOTS
  • FREE_MIN

Ruby 1.9.3 源代码

  • RUBY_GC_MALLOC_LIMIT(内存分配器malloc的限制)
  • RUBY_HEAP_MIN_SLOTS(堆空间最小容量)
  • RUBY_FREE_MIN(GC缩减heap_sweeps_free_min时留下的最少可用对象数)

Ruby 2.0.0 源代码

与Ruby 1.9.3相同

Ruby 2.1.0 源代码

  • RUBY_GC_HEAP_INIT_SLOTS(取代RUBY_HEAP_MIN_SLOTS,初始化heap_slots增长率)
  • RUBY_GC_HEAP_FREE_SLOTS(取代RUBY_FREE_MIN,GC缩减heap_sweeps_free_min时留下的最少可用对象数)
  • RUBY_GC_HEAP_GROWTH_FACTOR(新参数,heap_slots的增长率)
  • RUBY_GC_HEAP_GROWTH_MAX_SLOTS(新参数,heap_slots的最大允许容量)
  • RUBY_GC_MALLOC_LIMIT(内存分配器malloc的限制)
  • RUBY_GC_MALLOC_LIMIT_MAX(新参数,malloc限制的最大值)
  • RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR(新参数,malloc限制的增长率)
  • RUBY_GC_OLDMALLOC_LIMIT(新参数,oldmalloc的限制)
  • RUBY_GC_OLDMALLOC_LIMIT_MAX(新参数,oldmalloc限制的最大值)
  • RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR(新参数,oldmalloc限制的增长率)

Ruby 2.1.1 源代码

  • RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR(新参数,限制old对象数量的因子)

看起来Ruby 1.9.2没有RUBY_GC_MALLOC_LIMIT。相反,它具有使用#define宏初始化的GC_MALLOC_LIMIT。这意味着我们需要更改gc.c中的值并重新编译Ruby以控制GC运行的时间。 - ardsrk
另外,据我所知,在1.9.2中没有任何一项可以通过环境变量进行设置。 - Dylan Markow
太棒了!我们正在进行基础设施升级,这对于保持我们的调整完好无损非常有帮助(哈哈哈)。 - dhenze

14

从 Ruby 2.1.x 开始使用RGenGC 垃圾回收机制

export RUBY_GC_HEAP_INIT_SLOTS=600000
export RUBY_GC_HEAP_FREE_SLOTS=600000
export RUBY_GC_HEAP_GROWTH_FACTOR=1.25
export RUBY_GC_HEAP_GROWTH_MAX_SLOTS=300000

或者这个

# Boost Ruby
export RUBY_GC_HEAP_INIT_SLOTS=1000000 # 1M
export RUBY_GC_HEAP_FREE_SLOTS=500000  # 0.5M
export RUBY_GC_HEAP_GROWTH_FACTOR=1.1
export RUBY_GC_HEAP_GROWTH_MAX_SLOTS=10000000 # 10M
export RUBY_GC_MALLOC_LIMIT_MAX=1000000000    # 1G
export RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR=1.1
# export RUBY_GC_OLDMALLOC_LIMIT=500000000      # 500M
# export RUBY_GC_OLDMALLOC_LIMIT_MAX=1000000000 # 1G
# export RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR=1.1

性能提升的MRI Ruby补丁

$ rvm install 2.1.2 --patch railsexpress -n railsexpress
$ rvm --default use 2.1.2-railsexpress

1
第二个代码片段中的一些注释是误导性的:RUBY_GC_HEAP_INIT_SLOTSRUBY_GC_HEAP_FREE_SLOTS表示的是绝对数量,而不是字节。 - Agis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接