Vergleich: Geschwindigkeit von Webservern beim Ausliefern von statischen Dateien

Ich arbeite gerade mit zwei Freunden an einem Projekt, bei dem verschiedene Bereiche für Nutzer und Administratoren entstehen sollen. Das ganze ist webbasiert und wird mit der Sprache Python realisiert. Als Grundgerüst verwenden wir CherryPy 3.x. Dieses HTTP Framework ist recht einfach aufgebaut. Stellt uns aber genau die Funktionen zur Verfügung, die wir brauchen. Schränkt uns aber beim Entwickeln nicht zu sehr ein.

Aber lange Rede kurzer Sinn. Wir stehen gerade vor der Entscheidung, ob wir unsere statischen Dateien von CherryPy oder doch lieber von einem herkömmlichen Webserver ausliefern lassen. Aus diesem Grund habe ich kurzer Hand mal ein paar kleine Geschwindigkeitstests gemacht.

Mir ist natürlich klar, dass es recht unwahrscheinlich ist, dass ein in einer Skriptsprache geschriebener Webserver genauso schnell ist wie ein "richtiger" Webserver.

Vorbetrachtung:

Den größten Geschwindigkeitsvorteil werden Webserver, welche zum Beispiel in C/C++ geschrieben sind, durch spezielle Syscalls(Systemaufrufe) erreichen. So ist es zum Beispiel durch den Syscall sendfile() möglich, eine Datei fast direkt von der Festplatte an die Netzwerkkarte zu übertragen. Somit werden die drei Syscalls seek(), read() und write() durch nur einen ersetzt und es wird zusätzlich noch das Zwischenspeichern eingespart.

Durchführung:

Um die Geschwindigkeit zu testen lasse ich im ersten Durchgang CherryPy eine statische Datei ausliefern. Anschließend werde ich weitere Tests mit Apache und lighttpd durchführen.

Zum Testen habe ich den Apache Benchmark(kurz ab) eingesetzt. Dabei soll eine Datei so schnell wie möglich 10000 mal Ausgeliefert werden. Aufgerufen mit:

$ ab -n 10000

Als Betriebssystem setze ich ein Ubuntu 7.10 in der Standardinstallation ein.

Bei der Datei handelt es sich um eine 3585 Byte groß HTML-Seite.

Ergebnisse:

    CherryPy Apache lighttpd
Time taken for tests: sec 14.614303 1.831066 1.552379
Total transferred: bytes 37580000 38550000 38430000
HTML transferred: bytes 35850000 35850000 35850000
Requests per second: #/sec 684.26 5461.30 6441.73
Time per request: ms 1.461 0.183 0.155
Transfer rate: Kbytes/sec 2511.17 20559.61 24175.15

Fazit:

Festgestellt habe ich, dass der Unterschied zwischen Apache und lighttpd sehr klein war. Jedoch musste ich mit Erschrecken feststellen, dass CherryPy bei der Auslieferung von statischen Dateien fast 10 mal langsamer war als Apache und lighttpd.

Bei so einem Ergebnis kann man schon nicht mehr von einer Messabweichung sprechen. Im Moment ist es also besser statische Dateien durch einen herkömmlichen Webserver ausliefern zulassen als mit einem in Python geschriebenen Webserver.

Verwandte Artikel