我們都知道Debian/Ubuntu通過apt-get安裝的ruby包很慢(參考:各種Ruby實現的性能評測修正版本 )
通常我們都是通過自己從www.ruby-lang.org上下載源碼並編譯安裝ruby來繞過這個問題,並且自己編譯還可以打上各種補丁,比如這個(解決ruby 內存泄漏的超級大補丁發佈啦 )
但是自己編譯的ruby不能被dpkg -l識別,debian/ubuntu系統中有些包是依賴於ruby包的,安裝這些軟件包會要求安裝ruby包,這樣系統中就有兩個(或者更多)ruby。雖然這在大部分情況下都不是問題,但是有些腳本在開頭不是使用env來獲得ruby而是hardcode #/usr/bin/ruby,這個時候就有問題了。
debian/ubuntu apt-get得到的ruby(v1.8.7.72) 之所以會有性能問題(慢50%),是因爲倉庫中的是debug版本,而且編譯目標是i486平臺,拖累了性能,我們可以通過去掉調試標誌,指定到i686平臺,重新編譯deb包來解決這個問題。
1) 準備編譯依賴包:
sudo apt-get build-dep ruby1.8
2) 取得deb包源碼:
mkdir -p ~/build && cd ~/build
apt-get source ruby1.8
3) 修改編譯參數:
cd ~/build/ruby1.8-1.8.7.72/debian
修改rule文件,去掉CFLAGS中的"-g ", 並在頭部加上:
export DEB_BUILD_GNU_TYPE=i686-linux-gnu export DEB_BUILD_GNU_CPU=i686 export DEB_HOST_GNU_CPU=i686 export DEB_HOST_GNU_TYPE=i686-linux-gnu
4) 編譯:
cd ~/build/ruby1.8-1.8.7.72 && debuild -uc -us
5) 安裝:
cd ~/build && sudo dpkg -i *.deb
如果要打其他補丁(如MBARI補丁),可以在步驟3和4之間進行。
這樣,系統中就只有一份本地編譯優化過的ruby,所有使用到ruby的包都將受益。