Hohe Load Average mit Apache2 und MySQL

uepselon

New Member
Hallo,

ich habe einen V-Server bei Strato. Ansich hab ich 512 MB RAM zugesichert und 1024 MB dynamisch. Die Load Average liegt im Normalbetrieb zischen 0.5 und 2. Zur Mittagszeit steigt die Average stark an und ab 13:30 Uhr bis 15:30 Uhr werden Spitzenwerte bis zu 20 erreicht.

top - 14:45:15 up 6 days, 23:12, 1 user, load average: 11.46, 10.57, 11.08
Tasks: 63 total, 10 running, 53 sleeping, 0 stopped, 0 zombie
Cpu(s): 75.1% us, 24.9% sy, 0.0% ni, 0.0% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 2068404k total, 2033232k used, 35172k free, 10160k buffers
Swap: 3068392k total, 924280k used, 2144112k free, 317532k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22103 mysql 15 0 144m 32m 4388 S 15.3 1.6 5:40.97 mysqld
25789 wwwrun 16 0 80864 23m 12m S 4.0 1.1 0:12.77 httpd2-prefork
25716 wwwrun 16 0 82928 26m 13m R 3.7 1.3 0:11.26 httpd2-prefork
26565 wwwrun 16 0 82784 24m 11m R 3.7 1.2 0:05.04 httpd2-prefork
25812 wwwrun 16 0 82884 20m 8160 R 3.4 1.0 0:07.91 httpd2-prefork
25821 wwwrun 15 0 81196 23m 12m S 3.1 1.1 0:12.33 httpd2-prefork
26566 wwwrun 16 0 82872 24m 11m R 3.1 1.2 0:06.82 httpd2-prefork
25703 wwwrun 16 0 80216 23m 13m R 2.8 1.2 0:11.84 httpd2-prefork
26562 wwwrun 16 0 82788 20m 8128 S 2.8 1.0 0:03.38 httpd2-prefork
26573 wwwrun 16 0 79936 21m 11m S 2.8 1.0 0:04.20 httpd2-prefork
26580 wwwrun 16 0 82784 20m 8140 R 2.8 1.0 0:03.96 httpd2-prefork
25707 wwwrun 16 0 81200 23m 12m R 2.1 1.1 0:12.99 httpd2-prefork
25785 wwwrun 15 0 83992 25m 12m S 2.1 1.3 0:13.44 httpd2-prefork
25728 wwwrun 15 0 82876 26m 13m S 1.8 1.3 0:11.88 httpd2-prefork
25854 wwwrun 15 0 82952 26m 13m S 1.8 1.3 0:10.25 httpd2-prefork
25830 wwwrun 16 0 81244 24m 13m S 1.5 1.2 0:08.99 httpd2-prefork
25770 wwwrun 17 0 83892 25m 11m R 0.9 1.3 0:08.84 httpd2-prefork

Der Verbrauchte RAM wird mit "top" etwas komisch angezeigt (wohl durch den V-Server), der tatsächliche Verbrauch gestaltet sich wie folgt:

VPS Speichernutzung==>
Momentan genutzt: 548,98 MB
Zugesichert: 843,992 MB
Maximal nutzbar: 1128 MB

Als Apache2-Variante wird das Prefork-Modell verwendet, da PHP5 nicht mit dem Worker-Modell läuft, zumindest nicht ohne neukompilieren.

Die Apache2 settings sehen so aus:

StartServers 1
MinSpareServers 4
MaxSpareServers 8
ServerLimit 32
MaxClients 32
MaxRequestsPerChild 400

KeepAlive On
MaxKeepAliveRequests 250
KeepAliveTimeout 1

Mehr MaxClients kann ich nicht zulassen, da sonst der Prefork zuviel Speicher zieht und der Server mit Out-Of-memory abraucht.


Die MySQL-Settings sehen so aus:

key_buffer = 16M
max_allowed_packet = 2M
table_cache = 750
sort_buffer_size = 8M
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
max_connections = 50
query_cache_type = 1
query_cache_limit = 4M
query_cache_size = 20M
thread_cache_size = 6
open_files_limit = 2100
max_heap_table_size = 64M
tmp_table_size = 64M

Weiss jemand an welcher stelle ich noch was optimieren kann?

Viele Grüsse,
Tobias
 
Wer sagt denn, dass du die Kiste so stresst? Die Ausgabe in top bezieht sich immerhin auf das Wirtssystem und nicht deinen Virtual-Server. Es könnte also genauso gut eine andere Instanz auf dem Wirtssystem die hohe Load Avg. verursachen.
 
So sehe ich das auch. Wobei ich glaube (!!!), dass Du die apache2-childs runtersetzen kannst. Es sieht so aus, als ob sich manche davon langweilen. Wenn Du keine anderen Kunden auf dem Server hast, kannst Du auch lighttpd in Verbindung mit php5-fcgi und php5-xcache versuchen. Das sollte deutlich performanter sein als Apache2 mit mod_php5.
 
Naja, ich denke schon, dass ich den Server stresse. Ich habe 5 Webseiten mit zusammen ca. 5000 normalen Usern pro Tag. Zusätzlich habe ich einen Statistik-Code, den ca. 150 externe Webseiten verwenden, mit insgesamt so 20.000-30.000 Zugriffen pro Tag.

Ich verwende den eAccelerator zur Beschleunigung.

Die MySQL-DB hat zwei relative große Tabellen ca. 150.000 Datensätze, auf die alle paar Sekunden updates laufen, wobei diese über einen Index laufen und nicht so kritisch sein sollten.

Es gibt so alle 20-30 Sekunden slow-queries im mysql.log, mit 2-5 sec pro Abfrage, die gehen auch auf die besagten Tabellen, wobei ich an den Queries selbst kein Optiermungspotential mehr sehe. Indizies sind schon drauf.

Gruss,
Tobias
 
Du kannst ja mal prüfen, ob lighttpd und php-fcgi nicht eventuell den Apache ersetzen kann. Dann schaufelt normalerweise schon mal immens Resourcen frei.
 
Ja, werd ich mal prüfen. Wobei der Server und die Domains mit Plesk konfiguriert sind. Die ganze Config umzubiegen ist erstmal noch relativ grosser Aufwand.

Ich habe mal die MaxRequestsPerChild per Child noch runter gesetzt, mal schauen ob das noch was bringt.
 
Die MySQL-DB hat zwei relative große Tabellen ca. 150.000 Datensätze, auf die alle paar Sekunden updates laufen, wobei diese über einen Index laufen und nicht so kritisch sein sollten.
Autsch, du weißt schon, dass Indizes das Einfügen und Aktualisieren von Daten verlangsamen, da jedesmal der Index aktualisiert werden muss? Lediglich Selektion wird durch einen Index beschleunigt. Wenn du also mehr Einfüge- als Auswahl-Operationen auf die Datenbank fährst, solltest du dir die Anzahl der Indizes und Spalten, über die diese erstellt werden, gut überlegen...
 
Die Ausgabe in top bezieht sich immerhin auf das Wirtssystem

Das trifft zu, wenn in der VE-Konfiguration kein CPU-Limit gesetzt wurde, was ich in diesem Fall nicht annehme. Angesichts der von uepselon nachgelieferten Eckdaten in Sachen Traffic, ist der vServer einfach am Anschlag.
 
Das komische ist, bis ca. 13:30 läuft alles im grünen Bereich. Dann fängt die Belastung an zuzunehmen. Ab 15:30 bis 16:30 geht die Last wieder runter. Wobei die Zugriffe davor und danach mindestens genauso hoch sind. Abends kommen tendenziell sogar mehr Besucher auf die Seiten. :confused:

Ich habe jetzt auch mal parallel lighttpd installiert und auf Port 81 zum testen am Laufen gehabt. Problem ist hier das mod_rewrite Modul, die ganzen Apache htaccess-configs gehen mit lighttpd nicht. Extra für lighttpd die Config umschreiben, ist ein heiden Aufwand.

@Roger
Ja, da hast du recht, die Indizes sind für Abfragen. Da für die Updates allerdings im Vorfeld Abfragen laufen und der Abfrageanteil höher ist, bringen die Indizes mehr als sie kosten.
 
Ich hab jetzt mal auf den Apache2 mpm-worker umgestellt und PHP5 via FastCGI zum Laufen gebracht. Das Problem ist nun, es wird enorm viel Speicher verbraucht und alles läuft recht instabil. Im Browser kommt in 50% der Fälle ein HTTP-500 Server-Error. Bei einfachen Anfragen, die gecached sind kommt es weniger, bei komplexeren Anfragen mit viel MySQL-Zugriffen fast immer.
 
Back
Top