升級 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章