Zend Framework vs. Ruby On Rails
Posted by in Web-Rocker ShowdownHeute geht es um ein Frage, die mich schon lange beschäftigt: Was ist schneller? Zend Framework MVC oder Ruby on Rails? Und wie skalieren die unterschiedlichen Architekturen bei zunehmenden, parallelen Zugriffen? Wie effizient wird meine Hardware genutzt? Die Antworten auf diese Fragen habe ich natürlich für Euch in einem Web-Rocker Showdown empirisch ermittelt :-)
Mein Versuchsaufbau sieht wie folgt aus:
Hardware:
Dell PowerEdge 860
Intel XEON QuadCore mit 2,13 Ghz
4 Gb Arbeitsspeicher
SAS300 Hardware RAID0
2x 73Gb 10k SAS HDDs
Software:
Debian 5.0.7 x86_64
Apache Bench
Htop
Server Zend Framework:
Zend Server CE 5.0.4
PHP 5.3.3
Opcode Cache
Server RAILS3:
Zend Server CE 5.0.4
mod_rails (Phusion Passenger)
Ruby 1.8.7
Testapplikation:
Einfachst denkbare Applikation. Eine Standart-Applikation die mit dem ZF-Kommando und RAILS-Kommando erzeugt wurde. Zusätzlich wir mit den Kommandos ein Page-Controller mit Index-Action und Views erzeugt. Die Views wurden so angepasst, das auf das Byte genau, das gleiche HTML erzeugt wird. Beide Frameworks laufen im Environment “production”.
Testverfahren:
Mit Apache Bench wird 10.000 mal die URL http://127.0.0.1/page/index/ aufgerufen, 1x als Warmup und sofort im Anschluß 1x für die Messung. Die Durchläufe werden mit 1, 2, 4, 8, 16, 32, 64 und 128 zeitgleichen Zugriffen durchgeführt. Wenn ungefähr 9.000 Zugriffe geschehen sind, mache ich einen Screenshot von Htop, um die CPU-Auslastung ermitteln zu können. Danach notiere ich die Ergebnisse von ApacheBench. Hier interessierte mich die gemittelte Antwortzeit pro Request und die ermittelten Requests pro Sekunde.
Ergebnisse:
Requests pro Sekunde


Antwortzeit in Millisekunden
Hardwarenutzung:
Im folgenden nur die Screenshots von 1, 2 und 4 Zeitgleichen Zugriffen. Die Screenshots von 8 – 128 sehen nahezu identisch aus, wie mit 4 zeitgleichen Zugriffen.


Fazit:
Ruby On Rails zusammen mit dem mod_rails nutzt die Hardware optimal aus. Die Gesamtperformance ist ungefähr 3x besser, als beim Zend Framework MVC auf einem Zend Server, mit allen Optimierungen. Zwischen 4 bis 16 Zeitgleichen Verbindungen arbeitet Rails am effizientesten auf einem 4-Kern-Server. Die PHP-Applikation hingegen liefert ab 4 Verbindungen durchweg die gleiche Anzahl an Verbindungen pro Sekunde. Wenn der Zend Server die Hardware vollständig ausnutzen würde, könnte das Zend Framework MVC sicher noch 50% mehr Leistung bringen. Ich werde bei Gelegenheit mal nachforschen, was dort blockiert hat.
And the winner is: Ruby On Rails mit mod_rails
Update:
Nachdem ich in meinem Artikel Zend Server CE vs Zend Server vs DotDeb herausgefunden habe, das der Zend Server CE nicht die geeignete Platform war um diese zwei Frameworks zu vergleichen, habe ich die Ergebnisse des ZF vs. Rails Showdowns noch mal neu aufgetragen. Entgegen meiner Vemutung das ich noch 50% mehr Leistung erwarten könnte waren es satte 150%, die der kommerzielle Zend Server und der PHP-Stack aus dem DotDeb Repository schneller waren. Seht selbst:

Fazit 2:
Es gibt keinen Gewinner in diesem Vergleich. Wie wir aber sehen konnten hat die Wahl des richtigen PHP-Stacks eine enorme Tragweite, wenn es um die Performance geht.
You can follow any responses to this entry through the RSS 2.0 You can leave a response, or trackback.





Bitte berichte dann, wenn du herausfindest, wie man das ZF noch beschleunigen kann. Ich quäle mich auch schon länger an dem Problem, da etwas zu beschleunigen.
Durch den Einsatz eines Bytecode Caches habe ich es geschafft, die Performance um (ich glaube, hab die Ergebnisse nicht mehr im Kopf) 1/3 zu erhöhen. Allerdings wäre es natürlich super, wenn man das ZF noch vernünftig mit dem Server kombinieren kann.
Pingback: ZendServer CE vs. ZendServer vs. Dotdeb - Web-Rocker
When i visit a blog, chances are that I notice that most blogs are amateurish. On the contrary,I could honestly say that you writting is decent and your website solid.
schon mal mit ruby1.9.1 und rails3 ausprobiert? ruby1.9x und neuer ist 2,5 -3 mal schneller als ruby 1.8.x beim interpretieren.
@kos: Meinst Du das hat wirklich eine Auswirkung auf die Performance? immerhin werden vom Phusion Passenger beim Start des Servers ein paar Instanzen von der Rails Applikation gestartet und dann sollte ja eigentlich kein interpretieren mehr nötig sein, oder liege ich da falsch? Die Applikation läuft ja nicht als CGI.