Производительность Ruby on Rails на ARM - PullRequest
3 голосов
/ 27 октября 2010

Мне было интересно, можем ли мы заменить наши неттопы на базе Atom N270, на которых запущено веб-приложение Rails (ruby 1.8.6 ...), на какое-нибудь эквивалентное устройство на базе ARM (нам нравится установка без вентилятора, энергопотребление и т. Д.).

Устройство ARM было XScale-PXA270 @ 520, 128 МБ (и, возможно, некоторые более медленные SDRAM), работало под Linux, всегда было достаточно свободной памяти с сопоставимой производительностью, как у взломанного iPhone.

Сравнительный анализ производственной базы данных (SQLite) дал нам многообещающие результаты (ARM был просто На 20-30% медленнее), поэтому я попытался собрать ruby ​​(1.9.2p0).

Приложение rails работало очень медленно на ARM (загрузка из sql и генерация шаблонов в 10-20 раз медленнее). Я решил провести несколько тестов, чтобы найти узкие места.

Опять же, некоторые результаты были в порядке (на уровне более старого ruby ​​1.8.6, который мы используем сейчас, в 6 раз медленнее, чем ruby ​​1.9.2), а некоторые были очень медленными (в 20-30 раз медленнее). Fe. похоже, что методы хеширования в 40 раз медленнее в ARM. Запуск Ruby Benchmark Suite показал больше узких мест, цепочек, потоков, массивов ...

Я знал, что ARM медленнее, чем Atom, я просто не ожидал такой огромной разницы, особенно после того, как SQLite работал нормально.

Есть ли какой-то недостаток в Ruby в ARM, нужно ли мне применять некоторые исправления, это безнадежно и нужно переписать все приложение на C, если я хочу использовать устройство ARM или просто у устройства недостаточно вычислительной мощности?

Примеры

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

Atom N270, 1 ГБ

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, 128 МБ ruby 1.9.2p0 (2010-08-18) [arm-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

Ответы [ 3 ]

4 голосов
/ 27 октября 2010

Кажется, вы жалуетесь, что новые оптимизации в Ruby 1.9.2 (по сравнению с 1.8.x) специфичны для x86.Производительность Atom и ARM сопоставима для Ruby 1.8.x.Возможно, вы могли бы спросить список рассылки, посвященный рубину.Быстрый поиск показывает, что да, было много изменений в Ruby 1.9.x:

Ruby 1.9.2 приносит [...] значительные улучшения скорости в Ruby посредством виртуальной машины Yet Another Ruby (YARV) интерпретатор

Возможно, правильный вопрос: «Есть ли в YARV специфичные для x86 оптимизации? Могут ли эти оптимизации дублироваться в порте ARM?»

2 голосов
/ 20 мая 2013

Тот же тест на Raspberry Pi с немного более новыми пакетами:

pi@raspberrypi:~$ uname -a
Linux raspberrypi 3.6.11+
pi@raspberrypi:~$ ruby -v
ruby 2.0.0p195 (2013-05-14 revision 40734) [armv6l-linux-eabihf]
pi@raspberrypi:~$ 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 году):

pi@raschpi ~ $ uname -a
Linux raschpi 4.1.13-v7+ #826 SMP PREEMPT Fri Nov 13 20:19:03 GMT 2015 armv7l GNU/Linux
pi@raschpi ~ $ ruby -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [armv7l-linux-eabihf]
pi@raschpi ~ $ 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):

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.9.59-v7+ #1047 SMP Sun Oct 29 12:19:23 GMT 2017 armv7l GNU/Linux
pi@raspberrypi:~ $ ruby -v
ruby 2.3.3p222 (2016-11-21) [arm-linux-gnueabihf]
pi@raspberrypi:~ $ 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)
1 голос
/ 08 августа 2012

Используя код, приведенный в примере вопроса, это мои результаты на Raspberry Pi с 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...