Martin hat sich vor ein paar Tagen mal die deutsche Blogosphäre vorgeknöpft und zu nächtlicher Stunde verschiedene Blogs "gebenchmarked", mit erschreckenden Ergebnissen. Darauf hat Tobias Glawe mit einem Artikel reagiert. Dies habe ich zum Anlass genommen, hier auch mal ein bisschen den virtuellen Server dampfen zu lassen und entsprechend zu konfigurieren. Es ist erstaunlich, was man mit richtigem Caching aus so einer virtuellen Maschine herausholen kann.
Viel Technikzeug nach dem Break.
Unter der Motorhaube
Das Blog läuft auf einem 3-Node VPS bei VPS.net, was laut deren Website 1,2 GHz CPU und 768 MB Ram entspricht - also nicht wirklich viel. Alle Tests wurden von einer zweiten VPS mit Apachebench durchgeführt. Die Concurrency war 100 und insgesamt wurden 500 Requests abgeschickt.
Apache2 läuft in der von VPS.net "cloud-optimierten" Konfiguration:
Timeout 15 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 5 StartServers 5 MinSpareServers 5 MaxSpareServers 10 ServerLimit 30 MaxClients 30 MaxRequestsPerChild 100
...und bei PHP sorgt XCache für eine bessere Performance. Auf dem Server befindet sich ausschließlich mein Blog. Der relevante Teil der Apache-Config für nodomain.cc sieht aus wie folgt:
# mod_deflate (gzip) aktivieren <FilesMatch "\\.(js|css|html|htm|php|xml)$"> SetOutputFilter DEFLATE </FilesMatch> # ExpiresHeader: verhindert bedingte GET-Anfragen <IfModule mod_expires.c> ExpiresActive on ExpiresDefault "access plus 35 days" </IfModule>
Benchmarks
Zuerst mal harte Fakten, der Einfachheit halber poste ich hier nur die Connection Times.
Ohne Caching-Plugin
Serverload ca. 15 (!)
min mean[+/-sd] median max Connect: 0 2 4.2 0 40 Processing: 1182 12279 2730.9 13068 15873 Waiting: 777 11255 2625.3 12048 14689 Total: 1186 12281 2730.0 13068 15876
Mit W3 Total Cache Plugin
Serverload ca. 1
min mean[+/-sd] median max Connect: 0 1 2.4 0 22 Processing: 300 751 705.7 412 2811 Waiting: 275 724 704.2 388 2708 Total: 302 753 706.8 414 2815
Varnish ohne Caching-Plugin
Serverload: zu vernachlässigen
min mean[+/-sd] median max Connect: 0 420 1041.6 0 3001 Processing: 256 23355 29332.0 5102 130635 Waiting: 255 23352 29332.0 5101 130633 Total: 258 23775 29528.3 5476 130636
Varnish mit W3 Total Cache Plugin
Serverload: zu vernachlässigen
min mean[+/-sd] median max Connect: 1 2 1.2 1 5 Processing: 8 34 35.2 28 234 Waiting: 6 27 18.7 26 231 Total: 11 35 35.3 29 237
Erklärungsversuche
Ohne jegliches Caching-Plugin ist Wordpress bei großer Last eine richtige Serversau. Die Kiste hat fast gar nicht mehr reagiert und an den Responsezeiten sieht man, dass es dann auch nicht wirklich Spaß macht, das Blog zu benutzen. Die Verwendung von W3 Total Cache bringt schonmal einiges und ist wohl die zur Zeit beste Wahl auf einem Shared Hosting Server, auf den man keinen Zugriff hat, um Varnish zu installieren.
Varnish kann sein wahres Potenzial allerdings erst dann ausspielen wenn W3 Total Cache aktiviert ist. Ich vermute, das liegt an den modifizierten Cache-Headern, für die dieses Plugin verantwortlich ist.
Für Varnish verwende ich aktuell diese Konfiguration.
Fazit
Performancemäßig ist es gut um mein Blog bestellt - aber ich habe ja auch (noch) nicht soo den Besucheransturm. An den richtigen Stellschrauben gedreht und mit ein paar Helferlein (W3 Total Cache, Apache Config, Varnish) lässt sich auch aus einer LAMP-Umgebung für wenig Geld viel Performance herausholen. Probiert es einfach mal aus!
Ähnliche Artikel:
Statt XCode kannst Du auch APC verwenden, ich mag den persönlich lieber.
Und vor allem statt mod_php fastcgid verwenden oder gleich den Indiander durch lighttpd oder ngix ersetzen, falls nicht schon geschehen.
Auf jeden Fall aber ein bookmarkenswerter Artikel
Danke für den Hinweis, das werde ich bei Gelegenheit testen.
FastCGI ist nicht schneller als mod_php, und wenn das Blog die einzige gehostete Seite ist, ist mod_php schon OK. Auf einem VPS würde ich allerdings auch eher Lighty einsetzen - mit mod_magnet kann man Caching sehr schön und v. a. flexibel steuern. Nginx hingegen würde ich erst in Erwägung ziehen, wenn Lighty mit seinem 1-Prozess-Design nicht mehr ausreichend skaliert - das dürfte aber auch weit jenseits der Leistungsgrenze eines VPS liegen
Danke für die Info. Hast du Beispiele für eine mod_magnet-Config? Dann probier ich das gerne mal aus.
Wobei ich bezweifle, dass viel mehr als ca. 25 Requests/s drin sein werden - dank Varnish kommen diese mittlerweile ja gar nicht mehr beim Apachen an:
Server Software: Apache/2.2.9
Server Hostname: nodomain.cc
Server Port: 80
Document Path: /
Document Length: 23164 bytes
Concurrency Level: 100
Time taken for tests: 17.439 seconds
Complete requests: 500
Failed requests: 0
Write errors: 0
Total transferred: 11820990 bytes
HTML transferred: 11582000 bytes
Requests per second: 28.67 [#/sec] (mean)
Time per request: 3487.800 [ms] (mean)
Time per request: 34.878 [ms] (mean, across all concurrent requests)
Transfer rate: 661.96 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 29 34 2.2 34 59
Processing: 152 3089 809.6 3414 3497
Waiting: 37 1652 982.4 1658 3353
Total: 183 3123 809.4 3448 3530