Dieser Artikel ist gerade in Arbeit.
Die Leistungsfähigkeit von lighttpd und Apache soll qualitativ untersucht werden. Im Vordergrund steht dabei der Einsatz als Server für drei Webpräsenzen, die bereits seit einiger Zeit online sind. Die Software wurde dazu auf zwei isolierte Testsysteme übertragen. Betrachtet wurde die Performance auf einem Single- und einem Dual-Core-System, ausserdem der Effekt eines PHP-Bytecode-Caches, konkret XCache.
Quantitative Aussagen soll dieser Benchmark nicht liefern, da hierfür vor allem Optimierungen an der verwendeten Software und Hardware notwendig sind, die sehr stark von Einzelfall abhängen.
Die Leistungsfähigkeit von lighttpd und Apache wurde mit zwei Servern getestet:
Beide System waren über ein Cross-Over-Kabel direkt mit dem Client verbunden, die Übertragungsgeschindigkeit fest auf 100 MBit/s1) eingestellt. Auf dem Client wurden mit mit dem Programm ab (Apache Benchmark), jeweils 10 Minuten (-t 600) lang, Webseiten auf einem der Server abgerufen und die Anzahl der erfolgreichen Antworten pro Sekunde protokoliert (req/s). Nach jedem Testlauf wurden die Logdateien gelöscht und der Server neu gestartet. Jeder Testlauf wurde dreimal durchgeführt und der Durschnittswert gebildet. Die Zahl der gleichzeitigen Abrufe (concurrency) wurde nach jedem Trippel verdoppelt, also nacheinander auf 1 - 2 - 4 - 8 - 16 - 32 - 64 - 128 - 256 - 512 gesetzt. Sofern eine Datenbank zum Einsatz kam, war der tablespace auf einer RAM-Disk abgelegt, auf einen dedizierten MySQL-Server wurde verzichtet2). Unnötige Dienste (cron, mail etc.) waren deaktiviert. Beide Server waren identisch installiert und basierten auf Ubuntu Karmic Koala (32 Bit3)). Die für den Test relevante Software4) war:
Die Leistungsfähigkeit bei statischen Seiten, wurde bereits in einem früheren Benchmark untersucht. Die qualitative Einschätzung, dass lighttpd vor allem bei vergleichsweise kleinen Dateien performanter ist, gilt nach wie vor. Daher wurde dieser Test vor allem dazu verwendet um die Sättigung der Netzwerkschnittstelle bei beiden Systemen festzustellen, dazu wurde eine 60 kB große Datei verwendet.
| c=1 | c=2 | c=4 | c=8 | c=16 | c=32 | c=64 | c=128 | c=256 | c=512 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Apache 2.2 (P4) | 126,2 | 151,8 | 163,2 | 158,7 | 163,6 | 163,7 | 163,0 | 162,2 | 161,1 | 0 |
| Apache 2.2 (Athlon X2) | 131,9 | 144,5 | 148,3 | 154,7 | 157,1 | 157,6 | 159,5 | 160,1 | 159,5 | 159,6 |
| lighttpd 1.4 (P4) | 119,6 | 152,2 | 155,0 | 160,2 | 161,5 | 163,0 | 162,9 | 162,5 | 160,8 | 158,3 |
| lighttpd 1.4 (Athlon X2) | 134,2 | 143,8 | 150,2 | 154,7 | 156,2 | 158,9 | 159,8 | 161,0 | 157,5 | 155,7 |
In diesem konkreten Test können keine gravierenden Unterschiede festgestellt werden. Lediglich auf dem kleineren Server (Intel Pentium 4) bricht Apache bei 512 gleichzeitigen Zugriffen ab, auf dem Dual-Core-System arbeitet er auch bei diesem Wert klaglos. Zu beobachtet ist, dass beide System während des Tests kaum ausgelastet sind, die Saturierung erfolgt also ohne die CPU zu überlasten. Daraus folgt im Umkehrschluss, dass bereits der Server mit Pentium-4-CPU ausreichend Rechenleistung hat, um die 100 MBit/s des Netzwerks zu sättigen.
Bei genauer Betrachtung der Werte, fällt auf, dass der leistungsfähigere Server geringfügig schlechtere Transferraten liefert. Das liegt im konkreten Fall an der Netzwerkkarte, die auch bei anderen Protokollen langsamer ist. Dies fällt im Test allerdings nicht weiter ins Gewicht, da bei allen weiteren Aufgaben die Rechenleistung der entscheidende Faktor steht.
Dokuwiki ist eine Software um Wikis zu betreiben. Die Daten werden als Textdateien im Dateisystem abgelegt.
Als Beispiel für eine einfache Seite dient die Zeittafel der SmüPedia, die lediglich aus einer Tabelle besteht. Sie enthält nur HTML Code und hat keine externen Referenzen. Es werden ca. 15 KB HTML-Code übertragen.
| c=1 | c=2 | c=4 | c=8 | c=16 | c=32 | c=64 | c=128 | c=256 | c=512 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Apache 2.2 | 4,0 | 4,1 | 4,0 | 4,0 | 3,8 | 3,8 | 0,4 | 0 | 0 | 0 |
| lighttpd 1.4 | 4,2 | 4,1 | 3,9 | 3,9 | 3,8 | 3,8 | 3,8 | 3,8 | 3,8 | 3,8 |
| Apache 2.2 mit XCache | 16,2 | 16,9 | 16,8 | 16,7 | 16,5 | 16,2 | 15,5 | 6,5 | 5,0 | 0 |
| lighttpd 1.4 mit XCache | 16,5 | 16,8 | 16,1 | 15,6 | 15,6 | 16,4 | 16,4 | 15,0 | 14,2 | 13,2 |
| c=1 | c=2 | c=4 | c=8 | c=16 | c=32 | c=64 | c=128 | c=256 | c=512 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Apache 2.2 | 8,4 | 14,6 | 15,7 | 16,5 | 16,4 | 16,1 | 15,8 | 14,9 | 14,8 | 0 |
| lighttpd 1.4 | 8,0 | 14,2 | 16,0 | 16,1 | 16,9 | 16,0 | 15,8 | 15,2 | 15,4 | 15,3 |
| Apache 2.2 mit XCache | 39,5 | 56,4 | 60,6 | 70,6 | 70,4 | 69,4 | 68,7 | 66,5 | 67,2 | 0 |
| lighttpd 1.4 mit XCache | 36,0 | 51,3 | 62,8 | 68,1 | 69,7 | 67,9 | 70,3 | 70,5 | 68,8 | 68,3 |
Als Beispiel für eine komplexe Seite wird die Startseite der SmüPedia verwendet. Im Gegensatz zur o.g. einfachen Seite, wird zu ihrer Erzeugung mehr PHP Code durchlaufen, da Referenzen zu internen Elemente, wie etwa dem Blog und einer Galerie bestehen. Externe Elemente gibt es auch hier nicht, die übertragene Dateigröße beträgt ca. 48 KB.
| c=1 | c=2 | c=4 | c=8 | c=16 | c=32 | c=64 | c=128 | c=256 | c=512 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Apache 2.2 | 1,6 | 1,6 | 1,6 | 1,5 | 1,4 | 0,5 | 0,0 | 0,0 | 0,0 | 0,0 |
| lighttpd 1.4 | 1,6 | 1,6 | 1,5 | 1,5 | 1,3 | 1,3 | 1,3 | 1,4 | 1,3 | 1,3 |
| Apache 2.2 mit XCache | 2,8 | 2,8 | 2,7 | 2,7 | 2,6 | 2,4 | 2,2 | 0,1 | 0,0 | 0,0 |
| lighttpd 1.4 mit XCache | 2,8 | 2,7 | 2,6 | 2,7 | 2,6 | 2,5 | 2,6 | 2,6 | 2,6 | 2,6 |
| c=1 | c=2 | c=4 | c=8 | c=16 | c=32 | c=64 | c=128 | c=256 | c=512 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Apache 2.2 | 3,3 | 5,9 | 6,4 | 6,5 | 6,3 | 6,2 | 5,8 | 5,1 | 5,4 | 0,0 |
| lighttpd 1.4 | 3,3 | 5,8 | 6,4 | 6,3 | 6,2 | 6,2 | 6,0 | 5,5 | 5,3 | 5,3 |
| Apache 2.2 mit XCache | 6,0 | 10,1 | 11,2 | 11,4 | 11,4 | 11,2 | 10,9 | 10,2 | 10,0 | 0,0 |
| lighttpd 1.4 mit XCache | 5,5 | 9,6 | 10,9 | 11,1 | 11,0 | 10,9 | 10,6 | 10,3 | 10,3 | 10,3 |
Die Zahl der Anfragen, die von den Webservern beantwortet werden können, fällt hier drastisch niedriger aus, als beim reinen Dateitransfer. Hinsichtlich der Entscheidung Apache vs. lighttpd ist die Situation aber ähnlich. Grundsätzlich schenken sich die beiden Kontrahenten nichts. Der wesentlich Unterschied ergibt sich beim Verhalten unter Last. Ohne Unterstützung durch XCache macht Apache früher schlapp als lighttpd, mit dem Intel Pentium 4 Server bricht die Leistung bereits bei 32 bzw. 64 simultanten Zugriffen ein.
Welche Rechnerarchituktur die bessere ist, steht auch zweifelsfrei fest. Der Server mit AMD Athlon 64 X2 hat in beiden Szenarios die Nase vorn. Allerdings fällt die Steigerung nicht proportional aus. Bei einfacher Last, also nur einem simultanten Zugriff, können die Abfragen gerade verdoppelt werden, sobald mehrere Anfragen parallel verabeitet werden müssen, ist eine Steigerung von 250% bis 340% zu beobachten, das gilt sowohl für Apache, als auch für lighttpd. Beim Apache ergibt sich ferner eine höhere Stabilität, so können mit Dual-Core-System dann 256 statt nur 32 bzw. 64 simultane Anfragen verarbeitet werden.
Mit XCache als PHP Bytecode Cache kann die Leistung erhöht werden und im Falle von Apache auch die Stabilität. Allerdings kommt der Apache damit auch nur auf max. 256 gleichzeitige Abfragen, 512 schafft mit Dokuwiki nur lighttpd. Die Steigerung durch XCache beträgt bei der einfachen Seite 250% - 350% und bei der komplexen Seite 70% - 100%.
Als erster Testfall dient die Startseite von bloggertreffen.org. Sie enthält die zehn aktuellsten Artikel, es werden ca. 52 kB HTML-Code übertragen
| c=1 | c=2 | c=4 | c=8 | c=16 | c=32 | c=64 | c=128 | c=256 | c=512 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Apache 2.2 | 0,6 | 0,6 | 0,5 | 0,5 | 0,1 | 0,0 | 0,0 | 0,0 | 0,0 | 0,0 |
| lighttpd 1.4 | 0,5 | 0,5 | 0,5 | 0,5 | 0,3 | 0,2 | 0,2 | 0,2 | 0,1 | 0,0 |
| Apache 2.2 mit XCache | 0,7 | 0,8 | 0,7 | 0,7 | 0,6 | 0,5 | 0,0 | 0,0 | 0,0 | 0,0 |
| lighttpd 1.4 mit XCache | 0,7 | 0,8 | 0,7 | 0,7 | 0,5 | 0,5 | 0,5 | 0,5 | 0,5 | 0,5 |
| c=1 | c=2 | c=4 | c=8 | c=16 | c=32 | c=64 | c=128 | c=256 | c=512 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Apache 2.2 | 1,1 | 2,3 | 2,3 | 2,3 | 2,2 | 2,0 | 1,5 | 0,0 | 0,0 | 0,0 |
| lighttpd 1.4 | 1,1 | 2,2 | 2,2 | 2,2 | 2,1 | 1,9 | 1,1 | 0,3 | 0,2 | 0,0 |
| Apache 2.2 mit XCache | 1,5 | 2,9 | 3,0 | 3,0 | 2,9 | 2,8 | 2,4 | 2,3 | 2,5 | 0,0 |
| lighttpd 1.4 mit XCache | 1,5 | 2,9 | 3,0 | 2,9 | 2,8 | 2,6 | 2,1 | 4,8 | 1,7 | 2,5 |
Im zweiten Test wird ein Artikel von bloggertreffen.org abgerufen, dabei werden ca. 33 kB HTML-Code übertragen
| c=1 | c=2 | c=4 | c=8 | c=16 | c=32 | c=64 | c=128 | c=256 | c=512 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Apache 2.2 | 0,6 | 0,6 | 0,6 | 0,5 | 0,0 | 0,0 | 0,0 | 0,0 | 0,0 | 0,0 |
| lighttpd 1.4 | 0,6 | 0,6 | 0,6 | 0,4 | 0,0 | 0,0 | 0,0 | 0,0 | 0,0 | 0,0 |
| Apache 2.2 mit XCache | 0,9 | 0,9 | 0,9 | 0,8 | 0,8 | 0,4 | 0,0 | 0,0 | 0,0 | 0,0 |
| lighttpd 1.4 mit XCache | 0,8 | 0,8 | 0,8 | 0,8 | 0,7 | 0,7 | 0,8 | 0,7 | 0,7 | 0,0 |
| c=1 | c=2 | c=4 | c=8 | c=16 | c=32 | c=64 | c=128 | c=256 | c=512 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Apache 2.2 | 1,2 | 2,4 | 2,6 | 2,5 | 2,4 | 2,3 | 2,2 | 0,0 | 0,0 | 0,0 |
| lighttpd 1.4 | 1,2 | 2,4 | 2,5 | 2,4 | 2,2 | 1,6 | 1,5 | 0,4 | 0,2 | 0,1 |
| Apache 2.2 mit XCache | 1,8 | 3,2 | 3,5 | 3,5 | 3,4 | 3,2 | 2,7 | 2,4 | 2,3 | 0,0 |
| lighttpd 1.4 mit XCache | 1,7 | 3,4 | 3,4 | 3,4 | 3,3 | 3,1 | 2,7 | 6,2 | 2,8 | 3,6 |
Ähnlich wie beim Dokuwiki-Benchmark geben sich Apache und lighttpd in der Geschwindigkeit wenig. Apache bricht auch hier bei vielen gleichzeitigen Verbindungen früher ein als lighttpd. Mit XCache als PHP Bytecode Cache kann die Stabilität und Leistung erhöht werden. Die Leistungsteigerung beträgt zwischen 30% und 90%.
Auffallend ist der schlechte Performance auf dem Pentium 4 System. Für den produktiven Einsatz ist eine so niedrige Rechenleistung und Speicherausstattung, nur bei Blogs geringer Prominenz sinnvoll einsetzbar. lighttpd spielt aber hier auf niedrigem Niveau seine Stärken aus, im Zusammenspiel mit XCache sind immerhin 256 parallele Zugriffe machbar, Apache schafft gerade 32.
Um die Performance von lighttpd und Apache mit dem Blogsystems Serendipity zu prüfen, dient das Blog Farmblogger.
Im ersten Testfall wird die Farmblogger Startseite abgerufen. Sie enthält die zehn aktuellsten Artikel, es werden ca. 97 kB HTML-Code übertragen
| c=1 | c=2 | c=4 | c=8 | c=16 | c=32 | c=64 | c=128 | c=256 | c=512 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Apache 2.2 | 1,2 | 1,3 | 1,2 | 1,2 | 0,8 | 0,0 | 0,0 | 0,0 | 0,0 | 0,0 |
| lighttpd 1.4 | 1,3 | 1,3 | 1,2 | 1,1 | 0,9 | 0,9 | 0,9 | 0,9 | 0,9 | 0,9 |
| Apache 2.2 mit XCache | 3,0 | 2,7 | 2,6 | 2,4 | 2,4 | 1,6 | 1,0 | 0,0 | 0,0 | 0,0 |
| lighttpd 1.4 mit XCache | 2,9 | 2,8 | 2,4 | 2,3 | 2,4 | 2,1 | 2,1 | 2,1 | 2,0 | 2,0 |
| c=1 | c=2 | c=4 | c=8 | c=16 | c=32 | c=64 | c=128 | c=256 | c=512 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Apache 2.2 | 3,0 | 5,5 | 6,0 | 5,9 | 5,4 | 5,4 | 4,8 | 3,9 | 2,8 | 0,0 |
| lighttpd 1.4 | 2,3 | 4,9 | 5,1 | 4,9 | 4,9 | 4,6 | 4,5 | 3,6 | 3,0 | 4,6 |
| Apache 2.2 mit XCache | 5,8 | 10,9 | 12,0 | 11,8 | 11,3 | 10,1 | 9,6 | 9,0 | 8,8 | 0,0 |
| lighttpd 1.4 mit XCache | 5,8 | 11,2 | 11,6 | 11,3 | 11,0 | 9,6 | 8,4 | 9,6 | 10,7 | 6,2 |
Für den zweiten Testfall wird ein einzelner Artikel der Farmblogger abgerufen, dabei werden ca. 43 kB HTML-Code übertragen.
| c=1 | c=2 | c=4 | c=8 | c=16 | c=32 | c=64 | c=128 | c=256 | c=512 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Apache 2.2 | 1,5 | 1,5 | 1,4 | 1,4 | 1,3 | 0,0 | 0,0 | 0,0 | 0,0 | 0,0 |
| lighttpd 1.4 | 1,4 | 1,4 | 1,4 | 1,4 | 1,2 | 1,2 | 1,2 | 1,2 | 1,2 | 1,2 |
| Apache 2.2 mit XCache | 4,6 | 4,7 | 3,9 | 3,8 | 3,7 | 3,4 | 3,0 | 0,0 | 0,0 | 0,0 |
| lighttpd 1.4 mit XCache | 4,7 | 4,5 | 3,7 | 3,9 | 3,7 | 3,7 | 3,7 | 3,7 | 3,7 | 2,7 |
| c=1 | c=2 | c=4 | c=8 | c=16 | c=32 | c=64 | c=128 | c=256 | c=512 | |
|---|---|---|---|---|---|---|---|---|---|---|
| Apache 2.2 | 2,9 | 5,7 | 6,2 | 6,0 | 5,8 | 5,6 | 5,1 | 4,8 | 3,4 | 0,0 |
| lighttpd 1.4 | 3,0 | 5,7 | 6,2 | 6,0 | 5,8 | 5,7 | 5,1 | 5,2 | 5,4 | 5,6 |
| Apache 2.2 mit XCache | 10,2 | 18,4 | 20,8 | 20,5 | 18,3 | 17,4 | 15,7 | 14,3 | 14,7 | 0,0 |
| lighttpd 1.4 mit XCache | 10,2 | 19,0 | 20,7 | 20,3 | 17,8 | 16,5 | 15,3 | 15,0 | 23,1 | 16,0 |
Auch mit Serendipity wiederholt sich der Eindruck der beiden vorangegangen Tests. Im unteren Lastbereich geben sich lighttpd und Apache nicht viel. Bei vielen parallelen Zugriffen bricht der Apache weg, während lighttpd nach wie vor Seiten ausliefert.
Mit XCache als PHP Bytecode Cache kann die Leistung und beim Apache auch die Stabilität erhöht werden. Die Leistungssteigerung fällt deutlicher aus als beim Wordpress Benchmark. Auf dem P4 liegt sie zwischen 100% und 200%, auf dem Athlon X2 sind 90% - 250% möglich.
Im Vergleich mit dem Wordpress Benchmark scheint Serendipity performanter sein. Das deckt sich zwar grundsätzlich mit der praktischen Erfahrung, kann im konkreten Fall aber nicht bestätigt werden, da es sich um Installationen mit unterschiedlichen Inhalten und Funktionalitäten handelt.