Мне было интересно, можем ли мы заменить наши неттопы на базе 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