2010-10-27 50 views
3

我想知道是否可以用基於ARM的一些等效設備替代基於Atom N270的nettops,這些nettops運行Rails(ruby 1.8.6 ...)webapp(我們喜歡無風扇設置,功耗消費等)。ARM上的Ruby on Rails性能

ARM設備是XScale-PXA270 @ 520,128MB(可能還有一些速度較慢的SDRAM),運行linux時,總是有足夠的可用內存,性能與越獄版iPhone相當。對於生產數據庫(SQLite)的基準測試給了我們有希望的結果(ARM僅僅是 慢了20-30%),所以我嘗試構建ruby(1.9.2p0)。

ARM應用程序在ARM上運行速度非常慢(從sql中獲取並生成模板慢10-20倍)。我決定運行一些基準來尋找瓶頸。 (與我們現在使用的較老的紅寶石1.8.6相比,比ruby 1.9.2慢6倍),有些非常慢(慢20-30倍)。鐵。它看起來散列方法在ARM上慢了40倍。運行Ruby Benchmark Suite顯示出更多的瓶頸,字符串,線程,數組...

我知道ARM比Atom慢,我只是沒有預料到如此巨大的差異,特別是在SQLite運行良好之後。

ARM上有沒有Ruby的缺陷,我是否需要應用一些補丁,這是無望的,如果我想使用ARM設備或只是設備沒有足夠的計算能力,應該用C重寫整個應用程序?

實例

def fib(n) 
    return 1 if n < 2 
    fib(n-1)+fib(n-2) 
end 

Benchmark.bm do |x| 
    x.report { fib(32) } 
    x.report { fib(36) } 
    x.report { h = {}; (0..10**3).each {|i| h[i] = i} } 
    x.report { h = {}; (0..10**4).each {|i| h[i] = i} } 
    x.report { h = {}; (0..10**5).each {|i| h[i] = i} } 
end
ruby -rbenchmark bench.rb

原子N270,1GB

 
ruby 1.9.2p0 (2010-08-18) [i686-linux] 
     user  system  total  real 
    2.440000 0.000000 2.440000 ( 2.459400) 
16.780000 0.030000 16.810000 (17.293015) 
    0.000000 0.000000 0.000000 ( 0.001180) 
    0.020000 0.000000 0.020000 ( 0.012180) 
    0.160000 0.000000 0.160000 ( 0.161803) 

ruby 1.8.6 (2008-08-11 patchlevel 287) [i686-linux] 
     user  system  total  real 
12.500000 0.020000 12.520000 (12.628106) 
84.450000 0.170000 84.620000 (85.879380) 
    0.010000 0.000000 0.010000 ( 0.002216) 
    0.040000 0.000000 0.040000 ( 0.032939) 
    0.240000 0.010000 0.250000 ( 0.255756) 

的XScale-PXA270 @ 520,128MB 紅寶石1.9.2p0(2010-08-18)[掰linux]

 
     user  system  total  real 
12.470000 0.000000 12.470000 (12.526507) 
85.480000 0.000000 85.480000 (85.939294) 
    0.060000 0.000000 0.060000 ( 0.060643) 
    0.640000 0.000000 0.640000 ( 0.642136) 
    6.460000 0.130000 6.590000 ( 6.605553) 

建設有:

 

./configure --host=arm-linux --without-X11 --disable-largefile \ 
--enable-socket=yes --without-Win32API --disable-ipv6 \ 
--disable-install-doc --prefix=/opt --with-openssl-include=/opt/include/ \ 
--with-openssl-lib=/opt/include/lib 

ENV: 

PFX=arm-iwmmxt-linux-gnueabi 

export DISCIMAGE="/opt" 
export CROSS_COMPILE="arm-linux-" 
export HOST="arm-linux" 
export TARGET="arm-linux" 
export CROSS_COMPILING=1 
export CC=$PFX-gcc 
export CFLAGS="-O3 -I/opt/include" 
export LDFLAGS="-O3 -L/opt/lib/" 
#LIBS= 
#CPPFLAGS= 
export CXX=$PFX-g++ 
#CXXFLAGS= 
export CPP=$PFX-cpp 

export OBJCOPY="$PFX-objcopy" 
export LD="$PFX-ld" 
export AR="$PFX-ar" 
export RANLIB="$PFX-ranlib" 
export NM="$PFX-nm" 
export STRIP="$PFX-strip" 
export ac_cv_func_setpgrp_void=yes 
export ac_cv_func_isinf=no 
export ac_cv_func_isnan=no 
export ac_cv_func_finite=no 

+4

爲什麼你運行nettops作爲生產服務器?你應該有一個真正的服務器和nettops **連接**來瀏覽webapps,你不應該在nettops **本地運行web應用程序**如果你正在討論開發機器,請參考[the程序員的權利法案](http://www.codinghorror.com/blog/2006/08/the-programmers-bill-of-rights.html) – Jimmy 2010-10-27 12:50:43

+0

我注意到「ruby」標記的問題通常只有10-20個視圖,所以SO上的Ruby社區很小。正如在我的「答案」中,我建議去一個郵件列表。 – 2010-10-27 16:06:45

回答

4

看來你抱怨優化用Ruby 1.9.2新的(相比於1.8.x的時候)是86具體。 Ruby 1.8.x的Atom和ARM性能相當。也許你可以問一個特定於ruby的郵件列表。快速搜索顯示,是的,Ruby 1.9.x中有很多變化:

Ruby 1.9.2通過另一個Ruby VM(YARV)解釋器

也許正確的問題是「YARV是否具有x86特定優化?可以在ARM端口中複製這些優化嗎?「

1

使用在問題的例子引用的代碼,這些都是我在樹莓派的運行Raspbian結果與armv6l處理器:

uname -a 
Linux ginger 3.1.9+ #168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l GNU/Linux 

ruby -v 
ruby 1.9.3p194 (2012-04-20 revision 35410) [armv6l-linux-eabi] 

ruby benchmark.rb 
    user  system  total  real 
7.810000 0.000000 7.810000 ( 7.823737) 
53.520000 0.010000 53.530000 (53.630399) 
0.010000 0.000000 0.010000 ( 0.007818) 
0.090000 0.000000 0.090000 ( 0.090667) 
0.950000 0.030000 0.980000 ( 0.980731) 
2

樹莓PI的同一基準帶着幾分更新的套裝:

[email protected]:~$ uname -a 
Linux raspberrypi 3.6.11+ 
[email protected]:~$ ruby -v 
ruby 2.0.0p195 (2013-05-14 revision 40734) [armv6l-linux-eabihf] 
[email protected]:~$ ruby benchmark.rb 
     user  system  total  real 
    6.580000 0.000000 6.580000 ( 6.585575) 
    45.080000 0.000000 45.080000 (45.132900) 
    0.000000 0.000000 0.000000 ( 0.008709) 
    0.090000 0.000000 0.090000 ( 0.095851) 
    1.040000 0.010000 1.050000 ( 1.044347) 

更新爲RP2(2015年):

[email protected] ~ $ uname -a 
Linux raschpi 4.1.13-v7+ #826 SMP PREEMPT Fri Nov 13 20:19:03 GMT 2015 armv7l GNU/Linux 
[email protected] ~ $ ruby -v 
ruby 2.2.1p85 (2015-02-26 revision 49769) [armv7l-linux-eabihf] 
[email protected] ~ $ ruby benchmark.rb 
     user  system  total  real 
    4.450000 0.000000 4.450000 ( 4.446841) 
    30.460000 0.000000 30.460000 (30.473665) 
    0.010000 0.000000 0.010000 ( 0.002306) 
    0.020000 0.000000 0.020000 ( 0.023236) 
    0.290000 0.000000 0.290000 ( 0.292746) 

更新用於RP3-B(在2017年 - Raspian Jessie):

[email protected]:~ $ uname -a 
Linux raspberrypi 4.9.59-v7+ #1047 SMP Sun Oct 29 12:19:23 GMT 2017 armv7l GNU/Linux 
[email protected]:~ $ ruby -v 
ruby 2.3.3p222 (2016-11-21) [arm-linux-gnueabihf] 
[email protected]:~ $ ruby -rbenchmark benchmark.rb 
     user  system  total  real 
    4.030000 0.000000 4.030000 ( 4.032046) 
    30.940000 0.000000 30.940000 (30.943480) 
    0.000000 0.000000 0.000000 ( 0.001352) 
    0.000000 0.010000 0.010000 ( 0.013266) 
    0.260000 0.000000 0.260000 ( 0.251937)