锁定老帖子 主题:优化Debian/Ubuntu下的ruby
精华帖 (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的包都将受益。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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还真有点麻烦,两个隐藏的很深的目录。 |
|
返回顶楼 | |
发表时间:2009-01-26
最后修改:2009-01-26
今天手动升到了1.8.7,比ubuntu apt-get的1.8.6调试版 有2-3倍的提升,含有大量方法调用和递归提升尤为明显。 效果非常好。
|
|
返回顶楼 | |
发表时间: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,节后再测试一下 |
|
返回顶楼 | |
发表时间:2009-01-29
pkg-config的含义
http://blog.csdn.net/absurd/archive/2006/02/15/599813.aspx 我也遇到 emacs依赖的问题 |
|
返回顶楼 | |
发表时间: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运行速度是一样的。 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2009-04-18
我昨天在一台Ubuntu服务器上编译了ruby1.8的最新代码,版本是1.8.8,速度真不错。
|
|
返回顶楼 | |
浏览 6304 次