Apache2 Tuning mit mod_cache unter Ubuntu 10.04 LTS

In letzter Zeit habe ich mich mit ein wenig Apache2 Tuning befasst, es gibt verschiedene Möglichkeiten die Performance von Apache2 zu verbessern. Festplatten-Caching, Arbeitsspeicher-Caching, Configuration optimieren, Komprimierungen aktivieren und und und.

Das knifflige am Tuning von Apache ist mit Sicherheit, welche Ressourcen man überhaupt hat, es bringt zum Beispiel wenig ein System mit weniger als 512 MB Ram zu tunen. Das größte Problem ist immer der Arbeitsspeicher, sobald der ausgeht fängt der Server an auf die Festplatte zu swappen und das auf alle Fälle der GAU, damit hat man dann genau das Gegenteil bewirkt von dem was man eigentlich wollte. Bei den Tests sollte man auf alle Fälle seine System- und Arbeitsspeicherauslastung genau im Auge behalten und prüfen wie sich der Arbeitsspeicher füllt und ob der Server anfängt sein Swap vollzuschreiben. Es gibt leider kein Patentrezept für das Tuning von Apache, es kommt immer auf die Umgebung an, die man verwendet.

Als erstes sollte man feststellen, welche Leistung man hat. Um festzustellen wieviele Anfragen der Server pro Sekunde schafft, kann folgenden Befehl verwenden:

ab -n 100 -c 10 http://kekz.org/

Der Parameter -n bedeutet wieviele Anfragen an den Server gemacht werden sollten, hier 100. Der Parameter -c bedeutet die Anzahl der parallelen Anfragen, somit werden insgesamt 10*10 Abfragen parallel gemacht.

Nach dem der Befehl durchgelaufen ist, erhält man folgendes:

#ab -n 100 -c 10 http://kekz.org/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking kekz.org (be patient)…..done

Server Software:        Apache/2.2.14
Server Hostname:        kekz.org
Server Port:            80

Document Path:          /
Document Length:        20486 bytes

Concurrency Level:      10
Time taken for tests:   1.615 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      2075500 bytes
HTML transferred:       2048600 bytes
Requests per second:    61.90 [#/sec] (mean)
Time per request:       161.540 [ms] (mean)
Time per request:       16.154 [ms] (mean, across all concurrent requests)
Transfer rate:          1254.71 [Kbytes/sec] received

Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:     2  159 454.4      7    1615
Waiting:        2  144 415.8      6    1586
Total:          2  159 454.5      7    1615

Percentage of the requests served within a certain time (ms)
50%      7
66%      9
75%     13
80%     17
90%   1364
95%   1525
98%   1614
99%   1615
100%   1615 (longest request)

Erstmal nur der rot markierte Wert interessant, die Anfragen pro Sekunde die der Server verarbeiten kann. Derzeit sind es nur 61 pro Sekunde, was ja nicht gerade viel ist und meist die Basiskonfiguration von Ubuntu darstellt. Da stellt sich die Frage warum ist das so und das hat verschiedene Gründe:

  • Der Arbeitsspeicher vom Server wird nicht ausgenutzt.
  • Apache ist nicht richtig eingestellt.
  • WordPress selbst ist allerdings schon getunt mit: W3 Total Cache by W3 EDGE ® (anfangs waren es nur 7 Anfragen pro Sekunde, WordPress ist leider nicht gerade performant)

Bei dynamischen Webseiten gerade bei PHP-Scripte verhält es sich meist so, dass das Script den ganzen HTML-Inhalt bei jedem Auruf der Seite neu erstellen muss, obwohl sich eigentlich nichts oder nur sehr wenig an der Seite geändert hat. Warum sollte man dann nicht den fertigen Inhalt abspeichern und diesen zurückgeben, dann müsste man diesen nur noch aktualisieren, wenn sich was ändert und müsste nicht immer den ganzen Inhalt neu generieren? Genau das kann „W3 Total Cache“ ein Plugin für WordPress, aber damit nicht genug, was wäre wenn man die fertig generierten Inhalt nicht auf der langsamen Festplatte sondern im schnellen Arbeitsspeicher vorhält? Für sowas bietet Apache eine Lösung an: mod_cache

Das Modul kann man recht einfach aktivieren:

a2enmod cache

Damit ist das Basismodul aktiviert. Das alleine bringt allerdings noch nichts, da das Modul noch einen Handler benötigt um zu funktionieren. 2 Stück stehen zur Auswahl, „disk_cache“ und „mem_cache“. Der erste speichert wie der Name schon sagt, die Daten auf der Festplatte zwischen und das haben wir ja schon und der andere verwendet Arbeitsspeicher dafür, fein! 🙂

a2enmod mem_cache

Danach muss der Apache noch neugestartet werden und man kann wieder einen Benchmark machen.

Requests per second:    970.54 [#/sec] (mean)

Fast 1000 Anfragen pro Sekunde, das ist schon klasse! Der Cache wird natürlich nach Ablauf einer gewissen Zeit wieder geleert und der Arbeitsspeicher wird wieder freigegeben. Dann fallen auch die Anfragen pro Sekunde wieder auf 61 zurück, jedoch hat man so ein System, was bei Bedarf Leistung bereitstellen kann und wenn sie nicht benötigt gibt, wird die Leistung anderen Diensten zur Verfügung gestellt.

Wie schon am Anfang erwähnt, es gibt kein Patentrezept fürs Tuning und es kommt stark auf die Umgebung an, wieviele Besicher man hat, wie die Netzwerkanbindung ausgelastet ist, wie die CPU ausgelastet ist, ob es ein physikalischer oder virtueller Server ist, da muss man einfach rumprobieren! Aber ich hoffe, dass es einen Ansatz bietet was man machen kann. 🙂