Montag, 15. Oktober 2012

JRuby auf dem Raspberry Pi: Webserver-Performance

Neulich habe ich mir mehrere Raspberry-Pi-Rechner zugelegt und probiere verschieden Sachen damit aus. Der Raspberry Pi ist ein kleiner, billiger (etwa 40€) Einplatinenrechner mit folgender Ausstattung: ARM-CPU, 256MB RAM, Ethernet, schnelle Grafik mit Debian Linux. Zielgruppe sind eigentlich Schüler, die damit programmieren lernen sollen.

Die Kiste lässt sich auch als Webserver benutzen, dazu habe ich mit Sinatra unter MRI-Ruby und PostgreSQL einige Performancetests durchgeführt. Die gleiche Anwendung habe ich nun auch unter JRuby (statt MRI Ruby) getestet.

Installierte Software:

  • Soft-Float Debian wheezy (nur mit dem Soft-Float-ABI läuft Oracles Java7) 
  • Java 7 JDK für ARM
  • JRuby 1.7.0RC2
  • Trinidad-Webserver (Tomcat mit Rack-Interface)
Die Installation von Java 7 JDK und JRuby habe ich hier beschrieben

Test mit Apache Bench (ab), 500 requests, keine Concurrency.

1. Baseline: Ergebnis für MRI-Ruby, siehe auch www.µc.net/2012/10/raspberry-pi-als-webserver-mit.html


Requests per second:    4.91 [#/sec] (mean)
Time per request:       203.817 [ms] (mean)
Time per request:       203.817 [ms] (mean, across all concurrent requests)


2. Ergebnis für JRuby mit Trindad (keine Concurrency) nach Aufwärmen, der erste Request dauerte über 10 Sekunden

Start des Servers mit jruby -S app.rb -s Trinidad

Requests per second:    3.03 [#/sec] (mean)
Time per request:       329.990 [ms] (mean)
Time per request:       329.990 [ms] (mean, across all concurrent requests)



3. Ergebnis für JRuby mit Trindad (Concurrency 10)

Requests per second:    3.01 [#/sec] (mean)
Time per request:       3323.769 [ms] (mean)
Time per request:       332.377 [ms] (mean, across all concurrent requests)
Transfer rate:          3.81 [Kbytes/sec] received


Unter JRuby war der Speicherverbrauch wesentlich höher als unter MRI-Ruby, es waren nur noch etwa 20MB RAM frei (unter MRI etwa 90MB).

Verhalten mit invokedynamic

Start mit "jruby -Xcompile.invokedynamic=true -S app.rb -s Trinidad"

Hier gibt es eine Exception beim Server-Start,
 file:/home/pi/jruby-1.7.0.RC2/lib/ruby/gems/shared/gems/jruby-rack-1.1.10/lib/jruby-rack-1.1.10.jar!/rack/handler/servlet.rb:22:in `call'

es kommen keine sinnvollen Ergebnisse zurück :-(

Fazit für JRuby auf dem Raspberry Pi

JRuby ist keine so gute Wahl für den Raspberry Pi und diesen Use Case: die Performance und der Speicherverbrauch sind schlechter als unter MRI-Ruby. Anders sieht es aus, wenn man Java-Libraries benutzen will.

Links

Keine Kommentare:

Kommentar veröffentlichen