Ich wurde auf ein äußerst interessantes Projekt aufmerksam, nämlich Appserver.io. Appserver.io ist ein Webserver, welcher komplett in PHP geschrieben wurde und noch einige Zusatzfeatures mit sich bringt. Die Grundidee leuchtet ein: Wenn ich eine PHP-Software wie TYPO3 CMS betreibe, warum nicht gleich komplett im PHP Kontext arbeiten und so vielleicht den Overhead des Webservers, wie Apache/Nginx, minimieren. Ob Appserver aber wirklich schneller ist als das „alte“ Apache + PHP Gespann, wollte ich nun einmal testen. Dazu muss natürlich gesagt werden, dass Appserver in einer noch recht frühen 1.0.1 Version vorliegt und gegen eine Software antritt, welche bereits 20 Jahre alt ist.
Durchgeführt habe ich den Benchmark mit ApacheBench (kurz: ab), welches die Seite insgesamt 200 mal abruft und jeweils 5 Requests gleichzeitig versendet. Hinter der URL befand sich ein TYPO3 Neos im Production Context. Beide Maschinen waren identische Vagrant-Maschinen und hatten jeweils 2GB Ram und 2 CPU-Kerne zur Verfügung. Zudem haben beide dieselbe php.ini Datei verwendet und auch dieselbe php5-fpm Einstellung.
Wir sehen also ganz deutlich, dass Appserver.io doch deutlich langsamer ist, als Apache2 + php5-fpm. Trotzdem ist das Projekt weiterhin sehr interessant und vielleicht schaffen es die Entwickler ja noch an der Geschwindigkeitsschraube zu drehen, denn dann könnte dieses Projekt Apache2 tatsächlich ersetzen. Vor allem die Möglichkeit, den Webserver ganz leicht erweitern zu können, ohne tiefe Kenntnisse von C, C++ oder Ähnlichem, macht dieses Projekt so interessant.
Update vom 10.04.2015: Über eine Servlet-Engine in Appserver.io gibt es die Möglichkeit, eine PHP-Datei komplett aus dem RAM auszuführen. Dies wollte ich natürlich auch testen. Leider ist es im Moment nicht möglich, Neos oder ein anderes CMS per Servlet auszuliefern. Also habe ich einen eigenen Servlet geschrieben und dort per Zufall die Fakultät einer Zahl zwischen 10 und 40 berechnen lassen. Eine Vergleichbarkeit zu einem vollwertigen CMS ist hier aber dennoch mindestens fraglich. Trotzdem zeigt die Grafik das Potential dieser Technik und ich würde es sehr begrüßen, wenn dies auch bald mit einem kompletten CMS möglich wäre.
Ich habe hier nochmal die Ergebnisse in Textform angefügt:
1 2 |
[patrick:~/appserver-verg] 23s $ ab -n 1000 -c 5 http://192.168.33.33:9080/ This is ApacheBench, Version 2.3 <$Revision: 1604373 gt; Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.33.33 (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: appserver/1.0.1-52 Server Hostname: 192.168.33.33 Server Port: 9080 Document Path: / Document Length: 7724 bytes Concurrency Level: 5 Time taken for tests: 32.652 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 8009000 bytes HTML transferred: 7724000 bytes Requests per second: 30.63 [#/sec] (mean) Time per request: 163.262 [ms] (mean) Time per request: 32.652 [ms] (mean, across all concurrent requests) Transfer rate: 239.53 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 2 7.0 1 109 Processing: 57 161 37.7 161 293 Waiting: 57 161 37.7 161 293 Total: 58 163 37.8 163 294 Percentage of the requests served within a certain time (ms) 50% 163 66% 178 75% 188 80% 195 90% 211 95% 227 98% 239 99% 245 100% 294 (longest request) |
1 2 |
[patrick:~/appserver-verg] 1m29s 1 $ ab -n 1000 -c 5 http://192.168.33.32:9080/ This is ApacheBench, Version 2.3 <$Revision: 1604373 gt; Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.33.32 (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: Apache/2.4.7 Server Hostname: 192.168.33.32 Server Port: 9080 Document Path: / Document Length: 7724 bytes Concurrency Level: 5 Time taken for tests: 23.241 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 7977000 bytes HTML transferred: 7724000 bytes Requests per second: 43.03 [#/sec] (mean) Time per request: 116.206 [ms] (mean) Time per request: 23.241 [ms] (mean, across all concurrent requests) Transfer rate: 335.18 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 1.7 1 30 Processing: 42 115 25.8 114 213 Waiting: 42 115 25.8 114 213 Total: 42 116 25.8 116 213 Percentage of the requests served within a certain time (ms) 50% 116 66% 127 75% 134 80% 139 90% 148 95% 155 98% 169 99% 180 100% 213 (longest request) |
1 2 |
[patrick:~] 22 $ ab -n 1000 -c 5 http://192.168.33.33:9080/example/helloWorld.do This is ApacheBench, Version 2.3 <$Revision: 1604373 gt; Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.33.33 (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: appserver/1.0.1-52 Server Hostname: 192.168.33.33 Server Port: 9080 Document Path: /example/helloWorld.do Document Length: 15 bytes Concurrency Level: 5 Time taken for tests: 11.553 seconds Complete requests: 1000 Failed requests: 970 (Connect: 0, Receive: 0, Length: 970, Exceptions: 0) Total transferred: 382603 bytes HTML transferred: 16701 bytes Requests per second: 86.55 [#/sec] (mean) Time per request: 57.767 [ms] (mean) Time per request: 11.553 [ms] (mean, across all concurrent requests) Transfer rate: 32.34 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 7.0 0 111 Processing: 10 57 18.0 56 142 Waiting: 10 57 18.0 55 142 Total: 10 58 19.0 56 169 Percentage of the requests served within a certain time (ms) 50% 56 66% 64 75% 68 80% 72 90% 82 95% 90 98% 100 99% 108 100% 169 (longest request) |
Hallo Patrick, vielen Dank für den Test und deine positive Einschätzung. Wir wissen natürlich, dass wir aktuell noch nicht ganz an die Performance von Apache mit PHP-FPM ran kommen. Selbes gilt natürlich auch für Nginx. Wir gehen aber davon aus, dass wir mit unserem Update auf PHP 5.6, kommt mit der Version 1.1, einen deutlichen Schritt in die richtige Richtung machen werden. Erste Tests stimmen uns hier schon sehr positiv. Insgesamt war aber auch nicht die Intention den schnellsten Webserver im Markt zu bauen sondern wie ja auch von dir schon angerissen eine ganzheitliche PHP-Infrastruktur Lösung. Wenn man Performance Tests macht dann wird es insbesondere dann spannend, wenn man im appserver.io Anwendungen vorab in einem Servlet initialisiert und das Bootstrapping wegfällt. Dann ergeben sich schon deutliche Performance Vorteile. Leider klappt das halt mit den meisten Applikationen aktuell so noch nicht, da diese nicht für eine solche Infrastruktur entwickelt wurden. Wir sind aber guter Dinge, dass sich hier noch einiges tun wird. Parallel arbeiten wir gerade daran die Performance auch für Legacy-Apps zu verbessern. Einfach dran bleiben. In der Version 1.0.2 haben wir zum Beispiel das Handling und auch die Performance unter Windows sehr stark verbessert. Insgesamt ist unser Anspruch momentan eine vollumfängliche Infrastruktur-Lösung für PHP zur Verfügung zu stellen die für den Entwickler einfach im Handling ist. So ist die Installation auf dem Mac aber auch unter Windows in der nächsten Version mit Sicherheit einfacher als alle anderen Lösungen aktuell und trotzdem steht einem ein Set an Features wie zum Beispiel eine Message Queue out of the box zur Verfügung. Danke nochmal für den Bericht. Bei Fragen oder Anregungen kannst du dich natürlich gerne auch an uns wenden.
Stefan
Hallo Stefan,
vielen Dank für deine Rückmeldung. Tatsächlich überarbeite ich den Artikel gerade, um das fehlende Thema „Servlet“ noch hinzuzufügen.
Auch ging es hier in dem Artikel nur um die Performance und die ist eigentlich positiv zu beurteilen, immerhin sind es ja „nur“ 50ms unterschied zum 20 Jahre alten Apache. Das das Projekt noch weiter Vorzüge hat, steht schon auf meiner „Artikel-noch-zu-schreiben“-Liste 🙂
Nochmal vielen Dank für deine Rückmeldung.
Hallo Patrick,
cool da sind wir schon gespannt was du da dann berichten kannst. Ich finde auch, dass die Performance shcon gar nicht so schlecht ist. Vor allem wenn du appserver.io mal installierst und z.B. auf dem Mac mit dem Standard Apache mit mod_php vergleichst bist du ohne etwas zu machen schon deutlich schneller und die Installation ist ziemlich einfach. By the way wir haben einen Gitter Chat also wenn du Fragen hast kannst du die auch da rein hauen 🙂
https://gitter.im/appserver-io/appserver
Stefan