部署 升级 Ruby 2.1 以及 GC 调整

quakewang · 发布于 2014年02月28日 · 最后由 douxiance 回复于 2015年08月20日 · 6493 次阅读
162
本帖已被设为精华帖!

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

建议使用railsexpress的性能优化补丁(其中包括已经合并到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: https://github.com/tmm1/gctools ,它利用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的参数,这篇文章 http://tmm1.net/ruby21-rgengc/ 非常详细地介绍了各个参数的意义,还提供了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 
共收到 13 条回复
78

:thumbsup:

2楼 已删除
2622

干货!! 👍

1031

Cool, tmm1 还写了一个 profile 输出分析工具, 叫做 stackprof, 可以帮助找出性能瓶颈.

De6df3

详解一下 gctools/logger 呗

332

👍,如果谁再能跑一下 benchmark ,给出性能比较结果就更好,更有说服力了。

1342

tmm1 这人还不是 ruby core 的成员么。。

162

#7楼 @vincent 没有太多空闲服务器资源,我用ab跑了一下普通压力的,和2.0相比没有什么差别。

#6楼 @huacnlee tmm1的文章里面已经介绍很详细了,主要就是看major和minor GC发生的频率,旧代和新代 GC的统计,用来调整GC参数看效果用。

7929

看過 1.9 / 2.0 / 2.1 NewRelic Pref Graphs, GC 其實已經很大進步,餘下來的就是 Ruby Execution Speed,仍然有很大進步空間。

11694

GOOD!!

96

请问为何升级后,盖上电脑睡眠,再激活,就发现回到1.9.3了?

163

:plus1:

15615

:plus1:

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