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
我们在服务器使用的是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