升级 Ruby 2.1 以及GC调整

Ruby从1.8 => 1.9 => 2.0 => 2.1 一直在GC上不断地改进,最近2.1.1刚刚发布,抽空将我们的应用从2.0升级了一下,记录一下相关改动。

我们在服务器使用的是rvm,首先更新一下rvm:
rvm get head

淘宝提供了ruby相关的镜像,可以更新一下源,后续安装会快很多:
sed -i 's!cache.ruby-lang.org/pub/ruby!ruby.taobao.org/mirrors/ruby!' $rvm_path/config/db

安装2.1.1:
rvm install 2.1.1
建议使用[url=https://github.com/skaes/rvm-patchsets/tree/master/patches/ruby/2.1.1/railsexpress]railsexpress[/url]的性能优化补丁(其中包括已经合并到ruby 2.2 method cache的改进):
rvm install 2.1.1 --patch railsexpress

设置2.1.1为默认版本:
rvm use 2.1.1 --default

OobGC优化:
我们之前使用的unicorn自带的OobGC,它会固定在每N次请求后,执行一次GC。tmm1写了另一个OobGC: [url]https://github.com/tmm1/gctools[/url] ,它利用ruby 2.1新的gc事件,使用c扩展来进行更智能的OobGC,配置很简单,在config.ru里面加上:

require 'gctools/oobgc'
use GC::OOB::UnicornMiddleware

不过他不支持请求阶段的GC.disable,实际用我们的应用测下来和unicorn自带的OobGC+GC.disable相比,在普通压力测试下,平均响应时间稍慢2~3%,服务器的cpu消耗会少2%左右。

除了OobGC外,这个gem还提供了GC的日志输出,只要加上:
require 'gctools/logger'

可以在stderr看到具体的GC执行情况,用来判断GC参数调整是否合理十分有用。

GC参数调整:
和Ruby 2.0相比,2.1多了一些分代GC的参数,这篇文章 [url]http://tmm1.net/ruby21-rgengc/[/url] 非常详细地介绍了各个参数的意义,还提供了github用的参数配置。配合gctools/logger,我们最终调整的GC参数如下:

export RUBY_GC_HEAP_INIT_SLOTS=500000
export RUBY_GC_HEAP_FREE_SLOTS=700000
export RUBY_GC_HEAP_GROWTH_FACTOR=1.25
export RUBY_GC_HEAP_GROWTH_MAX_SLOTS=300000
export RUBY_GC_MALLOC_LIMIT=80000000
export RUBY_GC_OLDMALLOC_LIMIT=80000000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值