Benchmark – Textpattern mit und ohne Cache
Ich habe heute rein aus reiner Neugierde ausprobiert, wie effektiv das Cache-System asy_jpcache für Textpattern arbeitet beziehungsweise um welchen Faktor die Anzahl der ausgelieferten Seiten steigen würde. Mir ist klar, dass solche Benchmark-Werte nicht die repräsentativsten sind, daher beschreibe ich in aller Kürze die Testbedingungen damit sich jeder selbst ein Bild machen kann. Der Benchmark wird mit ApacheBench auf einem EEE PC ausgeführt und das Gerät, dessen Leistung getestet wird ist eine SheevaPlug mit einem 1,2Ghz ARM Prozessor und 512MB RAM. Der verwendete Webserver ist (natürlich) Nginx in der Version 0.8.31, der auf einem Debian Lenny läuft. Die beiden Rechner sind über einen 100Mbit-Switch verbunden (was aber keine Rolle spielen sollte, da die SheevaPlug ohnehin nicht so viel ausliefern kann). Die Seite, auf die der Benchmark ausgeführt wurde ist die Startseite von Textpattern nach einer frischen Installation.
Benchmark erfolgte mit diesen Parametern
ab -n 1000 -c 10 http://SheevaPlug/index.php
Benchmark #1 (ohne Cache)
Server Software: nginx/0.8.31 Server Hostname: SheevaPlug Server Port: 80 Document Path: /index.php Document Length: 7668 bytes Concurrency Level: 10 Time taken for tests: 390.297 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 8008000 bytes HTML transferred: 7668000 bytes Requests per second: 2.56 [#/sec] (mean) Time per request: 3902.969 [ms] (mean) Time per request: 390.297 [ms] (mean, across all concurrent requests) Transfer rate: 20.04 [Kbytes/sec] received
Benchmark #2 (mit Cache)
Server Software: nginx/0.8.31 Server Hostname: SheevaPlug Server Port: 80 Document Path: /index.php Document Length: 7668 bytes Concurrency Level: 10 Time taken for tests: 90.844 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 8238254 bytes HTML transferred: 7668000 bytes Requests per second: 11.01 [#/sec] (mean) Time per request: 908.438 [ms] (mean) Time per request: 90.844 [ms] (mean, across all concurrent requests) Transfer rate: 88.56 [Kbytes/sec] received
Natürlich ist die Betrachtung aller Werte wichtig für das Ergebnis, doch ich nehme für einen ungefähren Performancevergleich die “Time taken for tests” heran, die ohne Cache bei 390 Sekunden und mit Cache bei 91 Sekunden lag. Daraus folgt, dass durch den Einsatz eines Cache-Systems wie hier asy_jpcache etwa Faktor 390/91=4,3 mehr Seiten ausgeliefert werden können.
//Nachtrag: Ich habe (ohne mir noch viel mehr zu Versprechen) zu der oben genannten Konfiguration noch XCache hinzugefügt und es hat mich fast aus den Socken gerissen. Ich hätte ja mit einer winzigen Verbesserung gerechnet, aber seht selbst:
Benchmark #3 (mit Textpattern Cache und XCache)
Server Software: nginx/0.8.31 Server Hostname: SheevaPlug Server Port: 80 Document Path: /index.php Document Length: 7667 bytes Concurrency Level: 10 Time taken for tests: 26.063 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 8238247 bytes HTML transferred: 7667000 bytes Requests per second: 38.37 [#/sec] (mean) Time per request: 260.625 [ms] (mean) Time per request: 26.063 [ms] (mean, across all concurrent requests) Transfer rate: 308.69 [Kbytes/sec] received
Noch einmal konnten die 1000 Abfragen um fast Faktor 4 schneller ausgegeben werden, was am Ende bedeutet, dass ein optimiertes System mit einem Cache für das CMS kombiniert mit einem opcode Cache wie XCache in meinem Beispiel Faktor 390/26=15 schneller arbeiten kann. Mit weiteren Optimierungen ist da sicherlich noch etwas mehr drin, allerdings reicht dieser Wert für mich erstmal locker aus ![]()
Interessant
Interessanter wäre bei dem Testaufbau, wann welches Serverprogramm inkl. MySQL was ausgibt im Sinne von “überhaupt noch etwas ausgeben muss”.
asy_jpcache = full page cache = Ausgabe einer fertigen, optional gezippten Datei (wenn im Cache + Zeitrahmen)
XCache = PHP op-code cache = index.php + asy_jpcache PHP code wird compiliert vorgehalten.
Interessant wären also 1.000 verschiedene Seiten, die vor Auslieferung erst in den Cache eingelagert werden, weil das die Optimierungen auf dem ganzen Weg aufzeigen würde.
Hallo Markus,
vorab, du hast vollkommen Recht! Ich habe daher jeden Anspruch auf Repräsentativität vorher ausgeschlossen, weil man Äpfel ja nicht mit Birnen vergleichen kann. Im Produktiven Einsatz ist das Beispiel von Oben wahrscheinlich nicht wirklich so performant wie mit einer Seite gemessen, aber es war ja auch nur eine Spielerei mit dem neuen kleinen Homeserver, der keine Höchstleistung bringen und auch keine Umfangreiche Datenbank beherbergen muss.
Ich bin nach wie vor mit der Performance der oben genannten Konstellation zufrieden und habe mich auch weiterhin über die funktionsweise und das Zusammenspiel von einem Op-Code Cache System und einem CMS-Cache informiert. Im Nachhinein halte ich meine Verwunderung über die Performance-Steigerung mit einem Op-Code Cache auch für ein wenig überflüssig, aber man lernt immer wieder dazu
Eine 4-fache Beschleunigung finde ich schon genial. Ist die Frage wieviel man einer guten Optimierung noch an Geschwindigkeit rausholen kann. Danke für diesen lehrreichen Bericht ! LG Jenni
Kbytes/sec – zieh Dir mal die IEC 80000-13 rein.