Ruby作為伺服器端應用已經成熟了

robbin發表於2009-11-17
JavaEye網站在過去的Ruby on rails實踐當中,曾經被Ruby的記憶體洩露問題深深的困擾過,並且自己編寫了監控Ruby程式洩露的監控指令碼來解決這個問題。造成Ruby記憶體管理不善的原因主要來自於兩個方面:

一是Ruby GC的實現本身存在很多問題,關於這一點,以前已經多次討論,隨著MBARI記憶體補丁的釋出,已經基本解決。特別是隨著[url=http://www.rubyenterpriseedition.com/]Ruby Enterprise Edition[/url]整合MBARI補丁,以及不斷完善Ruby實現,已經讓Ruby可以作為一個穩定的後臺服務的實現了。

二是一些記憶體處理有問題的Ruby本地擴充套件庫造成的記憶體洩露,這種情況就必須儘量避免使用第三方庫,即使要用,也要保證它的穩定性。比方說JavaEye最早使用RMagic處理圖片,之後改成了mini_magick,JavaEye曾經一直使用hpricot來處理html tag和部落格匯入,也經常造成記憶體洩露,最近把hpricot全部替換成nokogiri以後解決了記憶體洩露。

在這裡特別值得一提的是REE([url=http://www.rubyenterpriseedition.com/]Ruby Enterprise Edition[/url]),隨著REE1.8.7版本釋出,REE不但可以提供ruby穩定的記憶體使用,而且經過GC引數的調整,可以最大化ruby服務端處理效能,非常值得推薦使用。

JavaEye網站在去掉hpricot,使用最新版本REE之後,記憶體洩露問題已經徹底消失。目前JavaEye網站使用的是rails2.3.4版本,fastcgi程式啟動以後使用了230MB記憶體,經過一段時間執行之後,可以穩定在210MB長期執行,效能也相當不俗。

因此現在可以認為,Ruby作為伺服器端應用已經到了成熟期了,完全可以放心在大型應用系統當中使用了,特別是Ruby也可以用來作為一個不需要高效能處理的long-term後臺服務了。

最後簡單說說REE的安裝:

1、下載:http://www.rubyenterpriseedition.com/download.html

2、REE提供了編譯好的二進位制版本,不過我喜歡自己編譯,編譯的步驟可以看文件:[url=http://www.rubyenterpriseedition.com/documentation.html#_manual_installation_for_experts]REE Documentation[/url]

3、編譯和標準Ruby是一樣的,但是REE提供了Google tcmalloc庫,可以提高Ruby分配記憶體的效率,編譯tcmalloc稍稍麻煩一點:

cd ruby-enterprise-x.x.x/source/distro/google-perftools-*
./configure --prefix=/usr/local --disable-dependency-tracking
make libtcmalloc_minimal.la

rm -f /usr/local/lib/libtcmalloc_minimal*.so*
cp -Rpf .libs/libtcmalloc_minimal*.so* /usr/local/lib/

編譯ruby的時候修改Makefile檔案,尋找 LIBS,新增$(PRELIBS)

LIBS = $(PRELIBS) -ldl -lcrypt -lm $(EXTLIBS)

make PRELIBS="-Wl,-rpath,/usr/local/lib -L/usr/local/lib -ltcmalloc_minimal"


然後檢測一下是否連結了tcmalloc庫:
ldd ruby
應該可以找到如下資訊:
libtcmalloc_minimal.so.0 => /usr/local/lib/libtcmalloc_minimal.so.0 (0x00002b748b51c000)

相關文章