Weitere Apache-Probleme nach dem Umzug: Apache für WordPress und begrenzten Speicher konfigurieren

Weitere Apache-Probleme nach dem Umzug: Apache für WordPress und begrenzten Speicher konfigurieren

Wer seit gestern versucht hat, andreas-reiff.de zu erreichen, hat wohl so manches Mal ein Problem festgestellt: sie war nicht erreichbar. Das sollte jetzt gefixt sein. Nicht nur das – ich bin fast schon überrascht, wie schnell sie läuft.

Nach dem Umzug gestern abend, wo alles zunächst gut aussah, war die Webseite heute früh nicht erreichbar. Auch auf den Server kam ich nicht mehr per SSH-Verbindung. Hmm.. leichte Panik.. Server neugestartet.. keine Reaktion.. mittlere Panik..

Der Neustart hat etwas länger gedauert, danach lief zunächst wieder alles. Im Laufe der Analyse der Logdateien stellten sich dann die Gründe heraus: das System hat begrenzten Speicher (RAM & Swap), der war vollgelaufen, und das System hatte angefangen, Apache2-Instanzen abzuschießen – war dabei aber dann leider auch nicht so erfolgreich, daß das System benutzbar geblieben wäre.

Wie so oft war dies der Beginn einer Google-Odyssee durch verschiedene Wissensportale, bis ich schließlich die eine Option ausfindig gemacht hatte, die alle Probleme lösen sollte. (Dazu mehr am Ende. Ja, als begnadeter Schriftsteller weiß ich, einen Spannungsbogen aufrecht zu erhalten – und auch sonst geistig auf höchstem Niveau zu unterhalten! :))

Das Ganze sieht dann ungefähr so aus (putty->top->SHIFT+m):

Spätestens dann geht auch nichts mehr. Der Speicher ist voll, und der Swap ist auch schon voll. Wer sich damit mal ein bisschen auseinander gesetzt hat, wird wissen, daß, sobald der Swap anfängt, vollzulaufen, die Systemgeschwindigkeit deutlich runtergeht. Analog zu Windows: wird die Auslagerungsdatei übermäßig beansprucht, läuft auch wenig. Hat man 20 Programme offen und schaltet zwischen 2 Programmen nur um, fängt die Festplatte erst einmal an zu arbeiten – und man muß sich gedulden (so lange man keine SSD hat). Auf dem System lief also nichts mehr – wie gesagt, selbst mit einem Terminal bin ich nicht mehr drangekommen, aufgrund der Festplattenzugriffe bzw. des fehlenden freien Speichers.

Nun folgten zahlreiche Optimierungen, wobei ich nach jeder dachte, das Problem gelöst zu haben. Mittlerweile bin ich recht sicher, daß alles in Ordnung ist, werde aber wohl mal schaun, ob der Server heute abend noch ordentlich läuft, und daraufhin dann entscheiden, inwiefern meine Bemühungen erfolgreich waren oder nicht.

Problemlösungen

Das Problem besteht bei mir darin, daß ein Apache2-Prozess gut 30MB Speicher benötigt. Dazu habe ich eine pre-fork Variante von Apache2 installiert, die pro Verbindung einen neuen Prozess startet (andere Varianten tun dies nicht, sondern starten z. B. nur einen neuen Thread). An sich kein Problem, wobei dieses Vorgehensweise wohl auch am ehesten für Systeme gedacht ist, wo eine Apache2-Instanz weniger als 30MB Speicher verbraucht. Das ist wohl schon am oberen Ende von dem, was vertretbar ist.

Das Entfernen von Modulen aus dem mods-enabled Verzeichnis hat keine wirkliche Besserung gebracht. Hier verbessert sich der Speicherverbrauch um keinen von mir meßbaren Wert.

Der Rest der Optimierungen lief ausschließlich in der apache2.conf (unter Debian, sonst wohl auch schon einaml httpd.conf) ab.

Hier gibt es ein paar Übeltäter.

1
2
3
4
Timeout 20
KeepAlive On
MaxKeepAliveRequests 50
KeepAliveTimeout 2

Die meisten Seiten empfehlen, KeepAlive direkt auf Off zu setzen. Ich habe mich dem entzogen, und den KeepAliveTimeout auf einen sehr kleinen Wert gesetzt. Ob das etwas bringt.. man weiß es nicht. Es sollte jedenfalls die Ladezeit der Seite positiv beeinflußt werden, wobei die maximal mögliche Anzahl gleichzeitiger Anfragen limitiert wird.

Soweit ich das eingeschätzt habe, verringert sich so die Anzahl parallel laufender Instanzen. Sie werden früher wieder freigegeben, das schont Resourcen. Durch den Timeout von 20s sollten ferner Prozesse, die warten, eher wieder für andere Aufgaben bereitstehen. 20s sollte für absolut alle Klienten ausreichen – außer die, die wie ich ab und an per GSM in der Bahn online gehen.

1
2
3
4
5
6
7
<IfModule mpm_prefork_module>
    StartServers        2
    MinSpareServers     1
    MaxSpareServers     2
    MaxClients          14
    MaxRequestsPerChild 500
</IfModule>

Schließlich habe ich versucht, die Anzahl der parallel laufenden Prozesse zu beeinflussen. Auch mit mäßigem Erfolg.

Wie ich so herausgefunden habe, beeinflussen StartServers, MinSpareServers sowie MaxSpareServers die Anzahl nur bedingt. StartServers beeinflußt die Anzahl nur unmittelbar nach dem Start, und SpareServers beeinflußt das Verhalten, wie viele Prozesse zusätzlich bereit gehalten werden, um Anfragen schnell abarbeiten zu können. Diese Anzahl bestimmt also, wie schnell Apache reagieren kann, wenn viele Anfragen zusätzlich kommen, begrenzt jedoch nicht die tatsächliche Höchstzahl von Anfragen.

Das jedoch mach MaxClients. Insofern, wenn ihr eine Sache aus diesem Post mitnehmt: passt MaxClients an euren vorhandenen Speicher an. Ein zu hoher Wert hier macht nicht etwa die Reaktion auf Anfragen schneller, sondern.. ab einem bestimmten Punkt.. fängt das System mit dem Swappen an, und alles wird gnadenlos langsam. Es gilt hier also, einen Wert zu finden, der möglichst groß, aber auch nicht zu groß ist. Sollten noch andere Programme auf dem Server laufen, sollte hier ferner ein ausreichend großer Freiraum für andere Aufgaben gelassen werden.

Testen läßt sich das mit einem guten Schätzwert. Benötigt Apache ca. 30MB pro Instanz, und haben wir 512MB Speicher (hier sollte man nur das tatsächliche RAM berücksichtigen), so scheinen 10 Instanzen angemessen, sie würden dann ca. 300MB Speicher belegen. Also trägt man diesen Wert in die Konfigurationsdatei ein (nano ist übrigens ein super Texteditor für Linux – man kommt sich richtig komfortabel vor, und die 3 Kommandos, die ich für den vi auswendig gelernt habe benötige ich hier gar nicht, da unten stets die wichtigsten Befehle angezeigt werden).

Anschließend sollte man die Webseite möglichst stark auslasten. Da, wenn man „überboten” hat (wie bei „Der Preis ist heiß”) alles aus ist (System reagiert nicht mehr) sollte man lieber etwas kleiner anfangen, wenn man sich nicht ganz sicher ist. Dann besorgt man sich ein Programm, mit dem man einen Lasttest durchführen kann, so wie z. B. WAST (Download ganz unten auf dieser Seite im Kommentar, da wo „this link” steht), oder macht das ganze direkt webbasiert per LoadImpact. Ich habe letztere Variante gewählt, und es folgen ca. 5 spannende Minuten, in denen die Last auf den Server kontinuierlich erhöht wird. (Das allerdings nur für eine Webseite – typischerweise würde man eher versuchen, tatsächliches Nutzerverhalten zu synthetisieren, allein.. für unsere Belange ist dies völlig ausreichend. Wobei wir hier eine Seite wählen sollten, die eine gute Mischung aus Text, Grafik und sonstigen Inhalten bietet.)

Besonders spannend ist es jedoch, parallel per top den Speicherverbrauch zu überwachen (s. o.). Hier sollte der Wert des benutzten Speichers bei Swap konstant bleiben.

Haben wir noch besonders viel freien Speicher, so können wir die MaxClients erhöhen, sonst sollten wir den Wert erniedrigen. Und wie gesagt.. ein zu hoher Wert macht das System immer deutlich langsamer als ein angemessen niedriger Wert, bis dahin, daß das System überhaupt nicht mehr reagiert.

Resourcen

Ich habe schon lange nicht mehr so lange recherchiert, bis ich eine Lösung für ein Problem gefunden hatte. Entsprechend umfangreich ist die Sammlung nützlicher Webseiten zu dem Thema.

Streßtest

Die Ergebnisse meines Load-Tests bei LoadImpact, einer guten, einfachen und für ausreichende Funktionen kostenlosen Webseite, um Lasttests durchzuführen, finden sich unter 1 und 2.
WAST, so wie bei MS beschrieben, findet sich nur noch als privater Upload unten in den Kommentaren dieser Seite („this link”).
Weitere Möglichkeiten eines Streßtests für Webseiten beschreibt – StackOverflow (die, wie ich gelernt habe, bereits Gamification eingesetzt haben, als es den Term noch gar nicht gab).
Apache Bench ist wohl auch eine sehr gute Lösung – wenn man es denn irgendwo rumfliegen hat, oder ohnehin auf seiner Testmaschine eine Apache-Installation hat. Mehr auch bei StackOverflow.

Apache Konfiguration

MaxClients bei StackOverflow
Alle spannenden Optionen für Apache, hier sollte man schaun, welches Modul (prefork?) man installiert hat, und welche Optionen dieses Modul unterstützt. (Man kann mit /etc/init.d/apache2 -l oder ähnlichem herausfinden, welches Modul aktiv ist).
Eine (für mich) falsche Liste von für einen WordPress-Betrieb benötigten Modulen von Apache
Apache Konfiguration bei wenig Speicher
Sehr guter Artikel über Optimierung von Apache für WordPress – den hätte ich mal früher finden und lesen sollen! Hat fast alle Lösungen, die ich mir zusammengesucht habe, schön und übersichtlich beschrieben.
Ebenfalls sehr umfangreich und gut
Ebenfalls sehr gut, leider fehlt hier die Betonung der Wichtigkeit von MaxClients.
Ebenfalls sehr gut
php Speicher bei StackOverflow

Umfangreichere Lösungen

Viele Lösungen hier fallen in die Kategorie Überleben von „slashdotting”, alternativ auch je nach Webseite, die man besucht im deutschen Raum „gemydealzt” sein oder ähnlich: wie sich eine durchschnittliche Webseite auf plötzlich deutlich gestiegene Popularität (durch Erwähnung auf einer extrem beliebten Webseite, wie z. B. slashdot vorbereiten kann. Plötzlich deutlich gestiegen heißt hier Besucherzahlen von 10 und mehr pro Sekunde (wobei erst mehrere Hundert pro Sekunde wirklich problematisch sein sollten – die Größenordnung, die ich pro Tag habe).
Alternativen zu Apache wie nginx
Informationen über Caching, Nginx et al (bereits oben in den Referenzen angeführt)
Schritt-für-Schritt WordPress-Optimierung mit Zwischenergebnissen – umfangreich und gut aufbereitet
Notfallhilfe, wenn der Server unter hoher Last steht
Wenn man mit seinem Blog viel Geld macht und eine teure kommerzielle Lösung benötigt
Apache optimieren: mehrere gute Tips

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.