`
rubynroll
  • 浏览: 201914 次
  • 性别: Icon_minigender_1
  • 来自: Wgt
社区版块
存档分类
最新评论

优化Debian/Ubuntu下的ruby

阅读更多

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

 

 

 

 

 

分享到:
评论
8 楼 lmxbitihero 2009-04-18  
我昨天在一台Ubuntu服务器上编译了ruby1.8的最新代码,版本是1.8.8,速度真不错。
7 楼 qinray 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


6 楼 rubynroll 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运行速度是一样的。




5 楼 gakaki 2009-01-29  
pkg-config的含义
http://blog.csdn.net/absurd/archive/2006/02/15/599813.aspx

我也遇到 emacs依赖的问题
4 楼 jhsea3do 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,节后再测试一下
3 楼 antter 2009-01-26  
今天手动升到了1.8.7,比ubuntu apt-get的1.8.6调试版 有2-3倍的提升,含有大量方法调用和递归提升尤为明显。 效果非常好。
2 楼 robbin 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还真有点麻烦,两个隐藏的很深的目录。
1 楼 zhr_wuxian 2009-01-21  
谢谢分享,速度万岁!

相关推荐

    debeasy:用于读取 Debian Ubuntu (DEB) 格式包的 Rubygem

    德贝西读取 Debian/Ubuntu(DEB 格式)包文件属性的一种非常简单的方法。 通过这种方式,它是的 Debian/Ubuntu 伴侣。用法 require 'debeasy'pkg = Debeasy.read("/path/to/package.deb")puts pkg.architecture=> ...

    用GitLab搭建自己的私有GitHub库的步骤

    下面介绍如何在 Debian/Ubuntu 和 Centos 下搭建配置 GitLab。 安装依赖 Debian/Ubuntu下: 代码如下: sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev ...

    apache2:apache2的厨师食谱

    描述本菜谱提供了完整的Debian / Ubuntu风格的Apache HTTPD配置。 本手册支持的非基于Debian的发行版(如Red Hat / CentOS,ArchLinux和其他版本)将具有模仿Debian / Ubuntu风格的配置,因为使用Chef可以更轻松地...

    die-koma.org:新网站的Jekyll代码

    Debian / Ubuntu # ruby installation stuff: sudo apt remove ruby # um ruby einmal zu deinstallieren, eigentlich nicht nötig im idealfall sudo apt install ruby # oder sudo apt --upgrade ruby # read ...

    Mac安装Homebrew的那些事儿

    简而言之,Homebrew是Mac Os的包管理工具,相当于Redhat Linux(Centos/RHEL/Fedora)的yum或者Debian Linux(Debian/Ubuntu)的apt-get。 如何安装Homebrew? 我们使用官网提供的统一安装方法,只需执行下面的命令即可...

    apache2:apache2食谱的开发存储库

    本手册支持的非基于Debian的发行版(如Red Hat / CentOS,ArchLinux和其他版本)将具有模仿Debian / Ubuntu风格的配置,因为使用Chef可以更轻松地进行管理。 Debian风格的Apache配置使用脚本来管理模块和站点...

    VIU-DSC-Fontend:VIU DSC Django应用程序的前端

    Debian / Ubuntu基地 $ sudo apt update $ sudo apt install nodejs $ sudo apt install npm Mac OSX 安装家庭酿造 $ /usr/bin/ruby -e "$(curl -fsSL ...

    ruby-llvm:LLVM的Ruby绑定

    Ruby-LLVM Ruby-LLVM是一种与LLVM编译器基础...Debian / Ubuntu 自制酒 LLVM可以通过执行brew install llvm --shared与Homebrew一起brew install llvm --shared 源代码和其他二进制文件 如果从源代码进行编译,则可

    Ruby-在RHELUbuntuDebian上从OSrepo安装MongoDB或者从10genrepository

    在RHEL/Ubuntu/Debian上从OS repo安装MongoDB或者从10gen repository

    rb-gsl:Ruby与GNU科学库的接口[与gsl gem兼容的Ruby 2.x和GSL 1.16分支]

    安装只需运行即可将Ruby / GSL安装为Ruby Gem 宝石安装rb-gsl 请注意,在可以安装Ruby / GSL之前,必须已经安装了GSL库: Debian / Ubuntu:+ libgsl0-dev + Fedora / SuSE:+ gsl-devel + Gentoo:+ sci-libs / gsl...

    ruby-irkit:IRKit Ruby客户端

    红外套件 Ruby客户端 要求Ruby2.0 + Mac OSX或Linux安装对于Mac % gem install irkit适用于Debian / Ubuntu Linux % sudo apt-get install libavahi-compat-libdnssd-dev% gem install irkitirkit命令% irkit --help...

    ubuntu_rvm:适用于RVM的Ubuntu软件包

    rvm使用mixed-mode安装进行安装:可由系统上的所有用户使用,并且在用户的$ HOME中具有孤立的Ruby/宝石集(请参阅更多); rvm已安装到/usr/share/rvm (按照Debian / Ubuntu约定); Ubuntu PPA提供的自动更新;...

    ros:Chef Cookbook,用于安装和配置机器人操作系统-ROS

    apt_uri -ROS Debian / Ubuntu软件包的apt存储库的URI。 默认值: 'http://packages.ros.org/ros/ubuntu' : 'http://packages.ros.org/ros/ubuntu' apt_components -apt回购组件的数组。 默认值: ['main'] apt_...

    gitolite-rugged:用于管理 Gitolite Git 后端系统的 Ruby 界面,简单;)

    它提供以下功能: SSH 公钥管理存储库管理Gitolite 管理存储库引导要求Ruby 2.x 一个有效的装置安装安装依赖项: # On Debian/Ubunturoot# apt-get install build-essential libssh2-1 libssh2-1-dev cmake libgpg-...

    px4test:连续交付的测试脚本

    install https://github.com/rmagick/rmagick.gitDebian / Ubuntu sudo apt-get install git-core mailutils libopencv-highgui-dev ruby-rmagick ruby-dev ninja-build安装使用gem安装Ruby依赖项: sudo gem ...

    blue_kitty:Ruby的最小3D游戏引擎

    对于Debian / Ubuntu系统,请使用: $ sudo apt install libvulkan-dev libsdl2-dev libglm-dev glslang-tools 将此行添加到您的应用程序的Gemfile中: gem 'blue_kitty' 然后执行: $ bun

    IFPB-PRPIPG.github.io:开发和技术解决方案中心页面

    重要的不要使用apt-get在Debian和Ubuntu上安装Ruby,Gems或Rails软件包。 该系统已过时,可能会引起头痛。 以下安装方法会在您的家庭中创建一种沙箱:〜/ .rvm。 是什么保证了更孤立的环境。要求/安装[Debian / ...

    mastercoin-wallet:使用QT的Ruby中的Masteroin钱包

    Debian / Ubuntu apt-get install libqt4-gui libqt4-dev cmake ruby​​-dev libssl-dev费朵拉百胜安装gcc-c ++ qt-devel cmake ruby​​-devel ruby​​gems 请注意,Fedora 20上的默认GTK主题

    eCommWar:顶级开源电子商务平台的排行榜。 促进建立可靠商店的最佳做法

    电子商务 ,顶级开源电子商务平台的排行榜。 贡献 这里缺少电子商务平台吗? 只需分叉存储库,然后将平台作为<name>.md添加...Debian / Ubuntu sudo apt install ruby-bundler ruby-dev 其他 检查ruby是否可以编译na

    笔记本电脑配置:一组Mitamae角色任务,用于配置基于Ubuntu的笔记本电脑

    先决条件基于Debian / Ubuntu的计算机。 尚未在任何其他操作系统上进行测试。 您还将需要获取所有必需的git子模块: $ git submodule update --init --recursive如果要保持“最新”状态,请确保不时更新本地子模块...

Global site tag (gtag.js) - Google Analytics