Tuning Apache

Apache Webserver

Tuning Apache

Ich gebe zu: die meisten Menschen werden das hier gelöste Problem nicht haben. Die meisten Menschen haben aber auch keine plötzlichen Useranstürme. Es kommt immer dann zum tragen, wenn der verfügbare Arbeitsspeicher zu gering für die Anzahl der Nutzer ist: Die Webseite baut sich Sekunden, oder gar Minutenlang nicht, oder nur Schleppend auf.

Das Problem der Gleichzeitigkeit

Ein Prozessor kann immer nur eine Sache gleichzeitig erledigen. Z.B. eine Datei lesen oder eine HTML Seite an einen potentiellen Nutzer schicken. Wer jetzt sagt: aber auf meinem Rechner laufen doch auch mehrere Programme gleichzeit liegt falsch. Der Eindruck der gleichzeitigkeit entsteht in etwa wie folgt:

Der Prozessor bearbeitet einen Teil einer Aufgabe, anschließend den Teil der nächsten Aufgabe, usw. Hält man die Intervalle zwischen den Sprüngen möglichst gering entsteht der Eindruck von Gleichzeitigkeit. Prozessoren mit mehreren Kernen oder Systeme mit mehreren Prozessoren entschärfen das Problem ein wenig. Sie können wirklich bestimmte Dinge gleichzeitig.

Nehmen wir an ihr betreibt einen kleinen V-Server bei Strato. Eure Seite kommt meistens und dann auch relativ schnell. Nehmen wir weiterhin an, ihr “erleidet” einen kleinen Nutzeransturm von sagen wir 100 Leuten die gleichzeitig über einen längeren Zeitraum auf Eurer Seite herumsurfen. Dies wird unweigerlich zu einem nahezu unlösbaren Performanceproblem. Denn oben genannte Tatsache vorausgeschickt, passiert ja nichts gleichzeitig. Die Nutzer warten also ständig aufeinander. Wie lange sie müssen ist allerdings nicht nur Abhängig von der Gleichzeitigkeit des Prozessors. Ein viel schwerwiegenderes Problem liegt in der Anzahl der zu startenden Apache Prozesse. Man muss sich im Grunde vorstellen, dass die Auslieferung jeder Datei einer Webseite ein kleines Programm startet. In der Konfigurationsdatei Eures Servers steht aber leider, dass die Anzahl der zu Startenden Prozesse (Max Servers) limitiert ist. Bei einem Strato V-Server der Billigvariante liegt die Zahl bei 10. Das ist ein recht vernünftiger Wert, denn der Arbeitspeicher ist begrenzt. Da wir aber einen Nutzeransturm haben müssen wir etwas unternehmen.

Als erstes benötigt Ihr Eure httpd.conf. Diese liegt unter /etc/apache2/ Dort müsst ihr zwei Werte ändern. Manchmal ist die httpd.conf in einzelne Dateien gesplittet. Dann haltet auschau nach einer server-tuning.conf.

Schritt 1 – Anzahl der Prozesse erhöhen

Wir können diesen Wert nicht beliebig hochsetzen, aber 20 Funkioniert meistens bei Systemen die mit einem variablen Arbeitsspeicher zwischen 128 und 256 MB ausgestattet sind. Wir können also jetzt 20 Dateien fast gleichzeitig ausliefern.

Das zweite Problem besteht in einer recht sinnvollen Einrichtung des Apaches. Um eine Datei zu übertragen muss zwischen dem Nutzer und dem Server eine Verbindung bestehen. Diese muss aufgebaut werden und das kostet Zeit. Man sagt auch: der Verbindungsaufbau ist “teuer”. Dabei einigen sich Client und Server wie sie den jetzt Daten austauschen wollen und das dauert eben verhältnismäßig lange. Allerdings reden wir hier von Millisekunden. Das ist für eine kleine Seite mit Nutzeransturm vernachlässigbar. Da der Verbindungsaufbau so “teuer” ist, wird die Verbindung normalerweise nicht pro Datei neu vereinbart, sondern für mehrere Dateien der gleiche Verbindungskanal genutzt. Man spart sich also in der Regel ein vielfaches der Millisekunden in dem man den Verbindungskanal einige Sekunden, in der Standardkonfiguration sind es 15, offen hält.

Problem dabei: Jeder Klick blockiert dabei einen zu startenden Server 15 Sekunden lang, weil dieser wartet ob von dem Nutzer noch etwas kommt. In der Regel kommen noch ein paar Bilder, vielleicht auch eine CSS-Datei. Und dann passiert erstmal nichts. Bis zum nächsten Klick. Der Prozess ist aber immernoch blockiert und kann infolgedessen keine weiteren Nutzer beliefern, welche ebenfalls warten. Denn weitere Prozesse können nicht gestartet werden. Wir haben ja nur 20.

Merke: Bei wenig Arbeitsspeicher ist das aufrechterhalten der Verbindung das eigentlich die auslieferung beseitigen sollte, der Hemmschuh!

Schritt 2 – KeepAlive abschalten

Das ganze Verfahren versteckt sich hinter dem wörtchen: KeepAlive. Ist der Wert auf “On” gesetzt tritt das beschriebene Problem auf. In diesem Falle ignoriert den Hinweis: “For maximal performance”… blablabla…

Eine Internetseite besteht bekanntermaßen aus vielen kleinen Dateien. Die erste angeforderte Datei ist normalerweise die HTML oder PHP oder in was auch immer ihr programmiert Seite. Stellt ihr jetzt KeppAlive auf “Off” und habt viele Nutzer passiert folgendes:

User 1 fragt die Seite an erhält eine Verbindung und daraufhin das HTML. Die Verbindung Verbindung wird geschlossen und ist für User2 frei. User 2 fragt die Seite an, erhält eine Verbindung und darauf hin das HTML. User 1 fragt das CSS an, erhält eine Verbindung und daraufhin das CSS. Es läuft also alles durcheinander. Aber da die Intervalle der Auslieferung hinreichend klein sind (es dauert nur ein paar Millisekunden ein HTML zu übertragen), fällt das dem Nutzer nicht auf. Er ist es ohnehin gewohnt, dass eine Internetseite erst nach 1 oder 2 Sekunden zu sehen ist.

Vorher lief das so: User eine fragt die Seite an, erhält eine Verbindung und daraufhin, das HTML, das CSS, und die Bilder. Anschließend wird die Verbindung weitere 15 Sekunden offen gehalten falls User1 nochmal klickt. In der Zeit wartet User2.

Ich hoffe das hilft. 

Diskussion

4 Kommentare zu “Tuning Apache”

  1. [...] nur 30 gleichzeitige Verbindungen zu. Auf das Problem der Gleichzeitigkeit bin ich bereits an anderer Stelle eingegangen. Ebenfalls voreingestellt ist das Keep-Alive-Timout. Im Standardfall beträgt dieser Wert 15 [...]

    Posted by SEO-Sunday – Performanceoptimierung dynamischer Websites « rankingCHECK Blog | Oktober 18, 2009, 14:46
  2. Danke! Ich habe letzte Zeit gemerkt, dass mein Apache zu langsam geworden ist :-( Ein Paar Tipps setze direkt um

    Posted by ossoft | April 8, 2010, 02:56
  3. “Vorher lief das so: User eine fragt die Seite an, erhält eine Verbindung und daraufhin, das HTML, das CSS, und die Bilder. Anschließend wird die Verbindung weitere 15 Sekunden offen gehalten falls User1 nochmal klickt. In der Zeit wartet User2.”
    Das stimmt nicht ganz. User 2 wartet nicht, wenn mit Keep Alive MaxConnections eine entsprechend hohe Zahl eingetragen wurde. Besser wäre den TimeOut auf 2 Sekunden zu stellen, das belastet den Server weniger als KeepAlive Off. Der Server macht sonst für jedes Objekt eine eigenen verbindung auf und gleich wieder zu. Das kostet Zeit und CPU.

    Posted by Jeuner | August 16, 2010, 12:06
  4. @Jeuner – Du hast recht. Aber so habe ich das eigentlich auch gemeint. Und zum Keep-Alive Off: Prozessorpower ist billiger als Speicher. Der Artikel bezieht sich ausschlißlich auf Fälle mit extrem begrenzten Ressourcen. Ich verwende in der Regel auch ein Keep-Alive-Timeout von 2 Sekunden. In hochfrequentierten Umgebungen, die mit genügen Ressourcen ausgestattet sind, macht das definitiv Sinn.

    Posted by Jakob Zogalla | August 16, 2010, 17:12

Post a comment

XING