论坛首页 编程语言技术论坛

优化Debian/Ubuntu下的ruby

浏览 6304 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-30   最后修改:2009-04-19

我们都知道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的包都将受益。

 

 

 

 

 

   发表时间:2009-01-21  
我的MacOSX上面的ruby 1.8.6已经被我干净彻底的删除掉了,尽管有些东西,例如TextMate的一些bundle,MacRuby都依赖与他。

我自己编译安装好ruby1.8.7以后,设置好环境变量,修改好符号链接,例如:

安装位置在: /usr/local/ruby187
创建符号链接:cd /usr/local && ln -s ruby187 ruby
修改自己的profile,添加 : export $PATH=/usr/local/ruby/bin:$PATH
创建符号链接:cd /usr/bin && ln -s /usr/local/ruby/bin/ruby ruby

这样就OK了,解决了所有的问题,而且非常干净。

BTW:在OSX上面删自带的ruby还真有点麻烦,两个隐藏的很深的目录。
0 请登录后投票
   发表时间:2009-01-26   最后修改:2009-01-26
今天手动升到了1.8.7,比ubuntu apt-get的1.8.6调试版 有2-3倍的提升,含有大量方法调用和递归提升尤为明显。 效果非常好。
0 请登录后投票
   发表时间:2009-01-28  
我在ubuntu(2.6.27-9-generic)上没有debuild指令的,用的dpkg-buildpackage -uc -us

编完后如下deb
irb1.8_1.8.7.72-1ubuntu0.1_all.deb
libdbm-ruby1.8_1.8.7.72-1ubuntu0.1_i386.deb
libgdbm-ruby1.8_1.8.7.72-1ubuntu0.1_i386.deb
libopenssl-ruby1.8_1.8.7.72-1ubuntu0.1_i386.deb
libreadline-ruby1.8_1.8.7.72-1ubuntu0.1_i386.deb
libruby1.8_1.8.7.72-1ubuntu0.1_i386.deb
libruby1.8-dbg_1.8.7.72-1ubuntu0.1_i386.deb
libtcltk-ruby1.8_1.8.7.72-1ubuntu0.1_i386.deb
rdoc1.8_1.8.7.72-1ubuntu0.1_all.deb
ri1.8_1.8.7.72-1ubuntu0.1_all.deb
ruby1.8_1.8.7.72-1ubuntu0.1_i386.deb
ruby1.8-dev_1.8.7.72-1ubuntu0.1_i386.deb
ruby1.8-elisp_1.8.7.72-1ubuntu0.1_all.deb
ruby1.8-examples_1.8.7.72-1ubuntu0.1_all.deb

安装ruby1.8-elisp_1.8.7.72-1ubuntu0.1_all.deb时失败,说是依赖emacs,没有继续装,我自己是开发环境,生产环境是debian etch,节后再测试一下
0 请登录后投票
   发表时间:2009-01-29  
pkg-config的含义
http://blog.csdn.net/absurd/archive/2006/02/15/599813.aspx

我也遇到 emacs依赖的问题
0 请登录后投票
   发表时间:2009-01-30   最后修改:2009-01-30
1) debuild包含在devscripts包中。apt-get install devscripts即可获得。

2) emacs依赖问题: 在aptitude中解决,或者直接把ruby1.8-elisp_1.8.7.72-1ubuntu0.1_all.deb删除掉,不去安装它。

3) pkg-config的问题: 这个是我的臆测和想当然,实际上ruby并不向系统注册一个新的pkg-config项。 我原本想说的是,自己从源码编译安装的ruby不能被系统包管理系统识别,也就是"dpkg -l"搜索不到。 这样导致的后果就是,如果有个一个包X是依赖于'ruby'这个包,那么安装这个X的时候,即使你的系统已经存在了自己编译的ruby,并且也像robbin那样建立好符合连接,设置好path...但是系统还是要求你安装从repo中来的'ruby',从而造成冗余。

最近我再仔细测试了一下,光去掉-g调试标志还是不能获得最佳速度,目前debian/ubuntu的package build system默认是编译成i486-linux,而我们现实中大部分cpu至少可以是i686,编译时选择i686这样MMX,SSE这些高级指令才能起到作用。

通过在debuild中传入-ai868与-ti686-linux-gnu参数并不能使系统正确地切换到i686模式,而被认为cross-compile,导致编译失败。

解决方法是,在rules文件的头部加上:

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


这样就可以强行让编译的时候指定cpu按i686优化。


经过测试,按这种方法优化后的ruby与自己从源码编译出来的ruby运行速度是一样的。




0 请登录后投票
   发表时间:2009-04-18   最后修改:2009-04-18
谢谢! 正在尝试重新编译Deb包, 希望能成功.

已经成功了, 同时打上了最新的GC patches


ii  ruby1.8                           1.8.7.72-3.1             Interpreter of object-oriented scripting lan
ii  ruby1.8-dev                       1.8.7.72-3.1             Header files for compiling extension modules
ii  ruby1.8-examples                  1.8.7.72-3.1             Examples for Ruby 1.8
qinray@ebox:/$ ruby -v
ruby 1.8.7 (2009-3-1 mbari 8B/0x8770 on patchlevel 72) [i686-linux]
qinray@ebox:/$ uname -a
Linux ebox 2.6.26-1-686 #1 SMP Sat Jan 10 18:29:31 UTC 2009 i686 GNU/Linux


0 请登录后投票
   发表时间:2009-04-18  
我昨天在一台Ubuntu服务器上编译了ruby1.8的最新代码,版本是1.8.8,速度真不错。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics