`
rubynroll
  • 浏览: 205107 次
  • 性别: 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=> ...

    Wkhtmltopdf python 包装器将 html 转换为 pdf.zip

    debian/ubuntu repos 中的版本功能有所减少(因为它是在没有 wkhtmltopdf QT 补丁的情况下编译的),例如添加大纲、页眉、页脚、目录等。要使用此选项,您应该从wkhtmltopdf站点安装静态二进制文件,或者您可以使用...

    安装rvm,把ruby版本提升至3.0.0

    1. 更新系统软件包:确保你的系统是最新的,可以通过运行`sudo apt-get update`(Ubuntu/Debian)或`brew update`(macOS,需要Homebrew)来完成。 2. 安装依赖:在Ubuntu/Debian上,需要安装`curl`和`gpg`,使用`...

    用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 ...

    linux ruby-2.5.3

    对于基于Debian或Ubuntu的系统,你可以使用`apt`包管理器来安装Ruby。首先,需要添加`ppa:ubuntu-toolchain-r/test`仓库,这个仓库包含较新的GCC版本,Ruby 2.5.3可能需要这个版本来编译: ```bash sudo add-apt-...

    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 ...

    Linux系统平台上安装和配置Ruby on Rails

    sudo apt-get install mysql-server libmysqlclient-dev # 对于Ubuntu/Debian sudo yum install mysql-server mysql-devel # 对于CentOS/RHEL sudo /usr/local/ruby/bin/gem install mysql2 ``` 最后,安装RoR框架...

    Install Ruby on Linux

    在Ubuntu或Debian系统上,可以使用以下命令安装: ```bash sudo apt-get update sudo apt-get install build-essential zlib1g-dev libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev ...

    Mac安装Homebrew的那些事儿

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

    linux版 ruby-2.3.0

    这些可以通过包管理器(如apt-get for Debian/Ubuntu或yum for CentOS/RHEL)来安装。 2. **下载源码**:从Ruby官方网站或者通过git克隆获取Ruby-2.3.0的源代码。压缩包文件"ruby-2.3.0"包含了所有源代码文件。 3....

    apache2:apache2食谱的开发存储库

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

    Ruby在Linux上的安装教程.docx

    **对于 Debian 或 Ubuntu 系统:** ```bash sudo apt-get install ruby-full ``` **对于 macOS 系统:** ```bash brew install ruby ``` **2. 验证安装** 安装完成后,使用 `ruby -v` 命令验证 Ruby ...

    sqlite3 ruby安装包

    sudo apt-get install sqlite3 libsqlite3-dev # 对于 Debian/Ubuntu sudo yum install sqlite-devel # 对于 CentOS/RHEL ``` 如果你遇到了特定版本的需求,例如压缩包文件名中提到的 `sqlite3-ruby-1.2.1-...

    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 源代码和其他二进制文件 如果从源代码进行编译,则可

    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_Programming

    例如,在Ubuntu或Debian上可以通过`sudo apt-get install ruby-full`进行安装。 #### 从源码构建 对于高级用户或者特定需求,可以从源码编译Ruby: 1. **下载源码**: 从Ruby官方网站下载最新的源码包。 2. **配置**...

    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...

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

    总结,安装MongoDB在RHEL/Ubuntu/Debian系统上主要涉及添加repository、安装软件包、启动服务以及在Ruby环境中使用MongoDB驱动。通过掌握这些步骤,你可以在开发过程中便捷地集成和使用MongoDB作为数据存储。

Global site tag (gtag.js) - Google Analytics