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

Sonntag, 14. Oktober 2012

invokedynamic - Vortrag von der JUDcon

Douglas Campos hat auf der JBoss Users & Developers Conference (JUDcon) im Juni einen Vortrag über invokedynamic von Java 7 gehalten. Das Video ist jetzt auf Youtube zu sehen.Mit invokedynamic bietet die Java 7 VM eine Schnittstelle für dynamisch typisierte Sprachen (z.B. JRuby), die eine enorme Perormancesteigerung verspricht.

Samstag, 13. Oktober 2012

JavaScript-Engine automatisch auswählen (für Gem-Entwickler)

Ganz interessanter Tip von sensible.io für Gem-Entwickler, die einen embedded JavaScript-Interpreter brauchen: benutzt das ExecJs-Gem von Sam Stephenson! Es wählt je nach Umgebung die passende JavaScript-Engine aus. Für JRuby ist das therubyrhino, für andere Ruby-Implementierungen natürlich was anderes. Durch ExecJS wird das dann portabel und als Gem-Entwickler muß man sich nicht mehr um die Plattform kümmern, auf der das ganze dann läuft.

Freitag, 12. Oktober 2012

Why JRuby - Vortrag von der Aloha RubyConf 2012

Charles Nutter kommt viel rum. Auf der Aloha RubyConf 2012 hat er einen längeren Vortrag über JRuby gehlaten und seine Slides online gestellt. Der Vortrag gibt einen Überblick über die Historie von JRuby, Performance, das JRuby-Team, das JVM-basierte Ökosystem und vieles mehr. Sehr interessant zum Durchklicken für Leute, die zwar von JRuby gehört haben, aber die Sinnfrage stellen.

Donnerstag, 11. Oktober 2012

Mittwoch, 10. Oktober 2012

JRuby 1.7.0RC2 (letzter RC?) ist da!

JRuby 1.7.0 wird bald fertig sein. Es ist gerade der RC2 erschienen, der als letzter Release-Candidate geplant ist.Schwerpunkt wurde auf das Verhalten bei high Concurrency gelegt, was die Enterprise-Entwickler freuen dürfte und vielleicht einge MRI-Nutzer zum Schwenk auf JRuby bringen wird. Als Default ist "invokedynamic" unter Java7 nicht noch nicht aktiviert (wg JVM-Issues). Unter Java 8 ist es aktiviert. Fürs Perfomance-Tuning gibt es eine extra Seite im Wiki.

Dienstag, 9. Oktober 2012

Charles Nutter - Rockstar

Ganz witzig: Charles Nutter (JRuby-Core), ist jetzt offiziell ein Rockstar! Die JavaOne-Konferenz zeichnet herausragende Sprecher mit diesem Titel aus. Hier gibt es ein kleines Interview dazu.

Montag, 8. Oktober 2012

Vortrag Lessons learned: use of modern JVM languages besides Java von Kai Wähner

Kai Wähner hat auf der JavaOne 2012 einen Vortrag mit dem Titel  Lessons learned: use of modern JVM languages besides Java gehalten. Die Vortragsfolien sind auf Slideshare zu sehen.
Er gibt einen Überblick über die Sprachen die auf der JVM laufen, über die Vorteile der JVM (concurrency!) und betrachte die Komplexität und Reife verschiedener Lösungen. Für seine Zwecke schneidet JRuby nicht am besten ab, aber es ist sehr interessant, mal über den Sprachen-Tellerrand zu schauen.

Sonntag, 7. Oktober 2012

Vorträge von der JavaOne-Konferenz von Charles Nutter

Charles Nutters Vorträge von der JavaObe-Konferenz sind online (Audio + Slides). Bischen schwierig zu finden, man muß rechts oben auf "Presentation Download" klicken..

Samstag, 6. Oktober 2012

JRuby auf der Grafikkarte?

AMD und Oracle arbeiten zusammen, um Java auch auf Grafikkarten zu bringen. Und zwar hat sich AMD am Projekt Sumatra beteiligt, wo der JDK in diese Richtung weiterentwickelt wird. Grafikkarten sind extrem gut in der Parallelverarbeitung per Hardware und damit passen sie sehr gut zu Java.

Freitag, 5. Oktober 2012

Concurrency mit JRuby auf der JVM

Alex Kira hat einen Vortrag mit dem Thema Concurrency using JRuby and the JVM gehalten. Die Vortragsfolien sind auf Slideshare abrufbar. Er gibt eine Übersicht über mögliche Techniken mit Codebeispielen in verschiedenen Sprachen.

Donnerstag, 4. Oktober 2012

SSH-Services mit JRuby und Apache MINA

Dylan Vassalo, einer der Autoren von Gitris (wir berichteten :-), hat auf seinem Blog beschrieben, wie er mit der Java-SSH-Implementierung Apache MINA einen SSH-Server in eine JRuby-Applikation integrieren konnte. Er zeigt auch, wie er die Authentifizierung über einen Github-Account bewerkstelligt hat. Sehr coole Sache.

Mittwoch, 3. Oktober 2012

Rubydoop: Hadoop Jobs in JRuby

Theo Hultberg hat Rubydoop 1.0 veröffentlicht. Damit kann man Hadoop-Jobs in JRuby schreiben. Apache Hadoop ist ein Big Data Framework zur Parallelverarbeitung extrem grosser Datenmengen. Rubydoops Quellcode liegt auf github zum Abholen bereit.

Dienstag, 2. Oktober 2012

Gitris: Multiplayer Tetris mit JRuby

Mal was sehr schräges: Dylan Vassallo und Victor Nilsson haben ein "Dual-Player-Remote-Tetris" entwickelt, das in einem Terminal-Fenster über SSH läuft. Authentifiziert wird über Github, der Server ist laut @headius in JRuby geschrieben (um beim Thema zu bleiben). Das ganze heisst gitris.


Montag, 1. Oktober 2012

Ruboto 0.9.0RC (JRuby auf Android) ist da!

Der erste Release Candidate von Ruboto 0.9.0 liegt zum Download bereit. Wichtigstes neues Feature ist Subclassing von Java-Klassen zur Laufzeit! Mit Ruboto können Ruby-Scripte auf Android-Geräten laufen und das komplette Android-API benutzen.